diff --git a/src/main/java/org/olat/course/nodes/projectbroker/datamodel/Project.hbm.xml b/src/main/java/org/olat/course/nodes/projectbroker/datamodel/Project.hbm.xml
index 7c5f3d83512af2a3385e1bc97ba0a912edbce51a..65a4f7d71525a5e9beb3a96e41fce11cfc5d6abf 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/datamodel/Project.hbm.xml
+++ b/src/main/java/org/olat/course/nodes/projectbroker/datamodel/Project.hbm.xml
@@ -40,7 +40,7 @@
 		column="projectgroup_fk" outer-join="false" cascade="none"/> 
 
 	<many-to-one name="projectBroker" class="org.olat.course.nodes.projectbroker.datamodel.ProjectBrokerImpl"  
-		column="projectbroker_fk" cascade="none"/>
+		column="projectbroker_fk" cascade="none" fetch="join"/>
  
  	<map name="customfields" table="o_projectbroker_customfields" cascade="all,delete-orphan" fetch="join">
         <key column="fk_project_id" not-null="true"/>
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java
index e3ee164b396367734a9b6875e3e939ddb622d71d..557157b8418c3f11afb4a06f63ed37dca58bbc50 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java
@@ -102,12 +102,13 @@ public class ProjectBrokerManagerImpl implements ProjectBrokerManager {
 	 * @param projectbroker_id
 	 * @return List of projects for certain project-broker
 	 */
+	@Override
 	public List<Project> getProjectListBy(final Long projectBrokerId) {
 		final boolean debug = log.isDebugEnabled();
 
 		long rstart = 0;
 		if(debug){
-			log.debug("getProjectListBy for projectBroker=" + projectBrokerId);
+			log.debug("getProjectListBy for projectBroker={}", projectBrokerId);
 			rstart = System.currentTimeMillis();
 		}
 		OLATResourceable projectBrokerOres = OresHelper.createOLATResourceableInstance(this.getClass(),projectBrokerId);
@@ -118,7 +119,7 @@ public class ProjectBrokerManagerImpl implements ProjectBrokerManager {
 	
 		if(debug){
 			long rstop = System.currentTimeMillis();
-			log.debug("time to fetch project with projectbroker_id " + projectBrokerId + " :" + (rstop - rstart));
+			log.debug("time to fetch project with projectbroker_id {} :{}", projectBrokerId, (rstop - rstart));
 		}
 		return projectList;
 	}
@@ -274,12 +275,12 @@ public class ProjectBrokerManagerImpl implements ProjectBrokerManager {
 			// invalide with removing from cache
 			projectCache.remove(projectBrokerId.toString());
 			if (deleteGroup) {
-				log.debug("start deleteProjectGroupFor project group=" + projectGroup);
+				log.debug("start deleteProjectGroupFor project group={}", projectGroup);
 				businessGroupService.deleteBusinessGroup(projectGroup);
 			}
 		});
 		
-		log.debug("DONE deleteProjectGroupFor project=" + project);
+		log.debug("DONE deleteProjectGroupFor project={}", project);
 	}
 
 	public int getNbrSelectedProjects(Identity identity, List<Project> projectList) {
@@ -341,7 +342,8 @@ public class ProjectBrokerManagerImpl implements ProjectBrokerManager {
 		return true;
 	}
 
-	public boolean canBeCancelEnrollmentBy(Identity identity,Project project,ProjectBrokerModuleConfiguration moduleConfig) {
+	@Override
+	public boolean canBeCancelEnrollmentBy(Identity identity, Project project, ProjectBrokerModuleConfiguration moduleConfig) {
 		// 6. date for enrollemnt ok
 		if (!isEnrollmentDateOk(project,moduleConfig) ){
 			return false;
@@ -350,10 +352,10 @@ public class ProjectBrokerManagerImpl implements ProjectBrokerManager {
 		if(!projectGroupManager.isDeselectionAllowed(project)){
 			return false;
 		} else {
-		if (moduleConfig.isAcceptSelectionManually()) {
-		  // could only cancel enrollment, when projectleader did not accept yet
-			return projectGroupManager.isProjectCandidate(identity, project) && !project.getState().equals(Project.STATE_ASSIGNED);
-		}
+			if (moduleConfig.isAcceptSelectionManually()) {
+			  // could only cancel enrollment, when projectleader did not accept yet
+				return projectGroupManager.isProjectCandidate(identity, project) && !project.getState().equals(Project.STATE_ASSIGNED);
+			}
 		  // could always cancel enrollment
 			return projectGroupManager.isProjectParticipant(identity, project); 
 		}
@@ -506,7 +508,7 @@ public class ProjectBrokerManagerImpl implements ProjectBrokerManager {
 	private void deleteAllReturnboxFilesOfProject(Project project, CourseEnvironment courseEnv, CourseNode cNode) {
 		VFSContainer returnboxDir = VFSManager.olatRootContainer(ProjectBrokerReturnboxController.getReturnboxBasePathForProject(project,courseEnv,cNode), null);
 		returnboxDir.delete();
-		log.debug("deleteAllReturnboxFilesOfProject path=" + returnboxDir);
+		log.debug("deleteAllReturnboxFilesOfProject path={}", returnboxDir);
 	}
 
 
@@ -517,7 +519,7 @@ public class ProjectBrokerManagerImpl implements ProjectBrokerManager {
 		// 1. check if alreday a projectBroker is in the cache
 		ProjectBroker projectBroker = projectCache.get(projectBrokerId.toString());
 		if (projectBroker == null) {
-			log.debug("find no projectBroker in the cache => create a new one projectBrokerId=" + projectBrokerId);
+			log.debug("find no projectBroker in the cache => create a new one projectBrokerId={}", projectBrokerId);
 			StringBuilder sb = new StringBuilder();
 			sb.append("select distinct project from ").append(ProjectImpl.class.getName()).append(" as project ")
 			  .append(" left join fetch project.projectGroup pGroup")
@@ -582,7 +584,11 @@ public class ProjectBrokerManagerImpl implements ProjectBrokerManager {
 	public List<Project> getProjectsWith(BusinessGroup group) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select project from ").append(ProjectImpl.class.getName()).append(" as project")
-		  .append(" where project.projectGroup.key=:groupKey");
+		  .append(" left join fetch project.projectGroup pGroup")
+		  .append(" left join fetch pGroup.baseGroup bGroup")
+		  .append(" left join fetch project.candidateGroup cGroup")
+		  .append(" left join fetch project.projectBroker pBroker")
+		  .append(" where pGroup.key=:groupKey");
 		return dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), Project.class)
 				.setParameter("groupKey", group.getKey())
@@ -629,7 +635,7 @@ public class ProjectBrokerManagerImpl implements ProjectBrokerManager {
 		Number count = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Number.class)
 			.setParameter("projectBrokerId", projectBrokerId).setParameter("title", newProjectTitle)
 			.getSingleResult();
-		return count == null ? false : count.intValue() > 0;
+		return count != null && count.intValue() > 0;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java
index 539c51c1b31ed9c97bc348c76b64ba23db8618be..d4a83a8c1170190c46689843a9b8ea61076b8953 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectGroupManagerImpl.java
@@ -30,6 +30,8 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.logging.log4j.Logger;
+import org.hibernate.LazyInitializationException;
 import org.olat.basesecurity.GroupRoles;
 import org.olat.basesecurity.SecurityGroup;
 import org.olat.basesecurity.manager.SecurityGroupDAO;
@@ -37,7 +39,6 @@ import org.olat.core.commons.persistence.DB;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.AssertException;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerCallback;
@@ -104,10 +105,10 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 				groupKey = accountManagerGroupProperty.getLongValue();
 				log.debug("accountManagerGroupProperty=" + accountManagerGroupProperty + "  groupKey=" + groupKey);
 			} 
-			log.debug("groupKey=" + groupKey);
+			log.debug("groupKey={}", groupKey);
 			if (groupKey != null) {
 				accountManagerGroup = businessGroupService.loadBusinessGroup(groupKey);
-				log.debug("load businessgroup=" + accountManagerGroup);
+				log.debug("load businessgroup={}", accountManagerGroup);
 				if (accountManagerGroup != null) {
 					return accountManagerGroup;
 				} else {
@@ -127,7 +128,7 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 					accountManagerGroup = businessGroupService.createBusinessGroup(identity, groupName + " _" + i, groupDescription, -1, -1, false, false, re);
 					i++;
 				}
-				log.debug("createAndPersistBusinessGroup businessgroup=" + accountManagerGroup);			
+				log.debug("createAndPersistBusinessGroup businessgroup={}", accountManagerGroup);			
 				
 				if (accountManagerGroupProperty != null) {
 					accountManagerGroupProperty.setLongValue(accountManagerGroup.getKey());
@@ -135,7 +136,7 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 				} else {
 					saveAccountManagerGroupKey(accountManagerGroup.getKey(), cpm, courseNode);
 				}
-				log.debug("created account-manager default businessgroup=" + accountManagerGroup);
+				log.debug("created account-manager default businessgroup={}", accountManagerGroup);
 			}
 		} catch (AssertException e) {
 			log.error("", e);
@@ -150,7 +151,7 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 	public void saveAccountManagerGroupKey(Long accountManagerGroupKey, CoursePropertyManager cpm, CourseNode courseNode) {
 		Property accountManagerGroupKeyProperty = cpm.createCourseNodePropertyInstance(courseNode, null, null, ProjectBrokerCourseNode.CONF_ACCOUNTMANAGER_GROUP_KEY, null, accountManagerGroupKey, null, null);
 		cpm.saveProperty(accountManagerGroupKeyProperty);	
-		log.debug("saveAccountManagerGroupKey accountManagerGroupKey=" + accountManagerGroupKey);
+		log.debug("saveAccountManagerGroupKey accountManagerGroupKey={}", accountManagerGroupKey);
 	}
 
 	@Override
@@ -196,13 +197,13 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 				if (accountManagerGroup != null) {
 					BusinessGroupService bgs = businessGroupService;
 					bgs.deleteBusinessGroup(accountManagerGroup);
-					log.info(Tracing.M_AUDIT, "ProjectBroker: Deleted accountManagerGroup=" + accountManagerGroup);
+					log.info(Tracing.M_AUDIT, "ProjectBroker: Deleted accountManagerGroup={}", accountManagerGroup);
 				} else {
 					log.debug("deleteAccountManagerGroup: accountManagerGroup=" + accountManagerGroup + " has already been deleted");
 				}
 			}
   		cpm.deleteProperty(accountManagerGroupProperty);
-			log.debug("deleteAccountManagerGroup: deleted accountManagerGroupProperty=" + accountManagerGroupProperty );
+			log.debug("deleteAccountManagerGroup: deleted accountManagerGroupProperty={}", accountManagerGroupProperty );
  	} else {
 			log.debug("deleteAccountManagerGroup: found no accountManagerGroup-key");
 		}
@@ -230,7 +231,7 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 		CourseGroupManager cgm = CourseFactory.loadCourse(courseId).getCourseEnvironment().getCourseGroupManager();
 		RepositoryEntry re = cgm.getCourseEntry();
 
-		log.debug("createProjectGroupFor groupName=" + groupName);
+		log.debug("createProjectGroupFor groupName={}", groupName);
 		BusinessGroup projectGroup = businessGroupService.createBusinessGroup(identity, groupName, groupDescription, -1, -1, false, false, re);
 		// projectGroup could be null when a group with name already exists
 		int counter = 2;
@@ -240,7 +241,7 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 			projectGroup = businessGroupService.createBusinessGroup(identity, newGroupName, groupDescription, -1, -1, false, false, re);
 			counter++;
 		}
-		log.debug("Created a new projectGroup=" + projectGroup);
+		log.debug("Created a new projectGroup={}", projectGroup);
 		return projectGroup;
 	}
 
@@ -271,7 +272,7 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 					if (!securityGroupDao.isIdentityInSecurityGroup(identity, project.getCandidateGroup()) ) {
 						securityGroupDao.addIdentityToSecurityGroup(identity, project.getCandidateGroup());
 						addedIdentityList.add(identity);
-						log.info(Tracing.M_AUDIT, "ProjectBroker: Add user as candidate, identity=" + identity);
+						log.info(Tracing.M_AUDIT, "ProjectBroker: Add user as candidate, identity={}", identity);
 					}
 					// fireEvents ?
 				}
@@ -288,7 +289,7 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 				Project reloadedProject = (Project) dbInstance.loadObject(project, true);
 				for (Identity identity : addIdentities) {
 					securityGroupDao.removeIdentityFromSecurityGroup(identity, reloadedProject.getCandidateGroup());
-					log.info(Tracing.M_AUDIT, "ProjectBroker: Remove user as candidate, identity=" + identity);
+					log.info(Tracing.M_AUDIT, "ProjectBroker: Remove user as candidate, identity={}", identity);
 					// fireEvents ?
 				}
 				return Boolean.TRUE;
@@ -387,7 +388,7 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 			Project project = iterator.next();
 			List<Identity> candidates = securityGroupDao.getIdentitiesOfSecurityGroup(project.getCandidateGroup());
 			if (!candidates.isEmpty()) {
-				log.info(Tracing.M_AUDIT, "ProjectBroker: Accept ALL candidates, project=" + project);
+				log.info(Tracing.M_AUDIT, "ProjectBroker: Accept ALL candidates, project={}", project);
 				acceptCandidates(candidates, project, actionIdentity, autoSignOut, isAcceptSelectionManually);
 			}
 		}	
@@ -415,7 +416,11 @@ public class ProjectGroupManagerImpl implements ProjectGroupManager {
 	
 	@Override
 	public boolean isDeselectionAllowed(Project project){
-		return project.getProjectGroup().isAllowToLeave();
+		try {
+			return project.getProjectGroup().isAllowToLeave();
+		} catch (LazyInitializationException e) {
+			return projectDao.loadProject(project.getKey()).getProjectGroup().isAllowToLeave();
+		}
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUriBuilder.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUriBuilder.java
index 7779d2c80564cd2286dbd18074a8896a905e7400..dd2d71132ce1b2b21b5f01ea743f90fb4333f7bc 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUriBuilder.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUriBuilder.java
@@ -150,7 +150,7 @@ public class BigBlueButtonUriBuilder {
     private static String checksum(String s) {
     	String checksum = "";
     	try {
-    		checksum = org.apache.commons.codec.digest.DigestUtils.sha256Hex(s);
+    		checksum = org.apache.commons.codec.digest.DigestUtils.sha1Hex(s);
     	} catch (Exception e) {
     		log.error("Cannot calculate checksum", e);
     	}
diff --git a/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUriBuilderTest.java b/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUriBuilderTest.java
index 9ad26afff1712f2c5cb1ad2775077d82d866b310..55063ca5e8f6110fdcfb86288cba293c5bcd1dd5 100644
--- a/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUriBuilderTest.java
+++ b/src/test/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUriBuilderTest.java
@@ -46,7 +46,7 @@ public class BigBlueButtonUriBuilderTest {
 		       .parameter("moderatorPW", "333444");
 		
 		String url = builder.build().toString();
-		Assert.assertEquals("https://bbb.openolat.org/bigbluebutton/api/create?name=Test+Meeting&meetingID=abc123&attendeePW=111222&moderatorPW=333444&checksum=da9185f7f333cfdfcd6eeac32dca3777510c4c436020d8b887ba5515bd1d189e" , url);
+		Assert.assertEquals("https://bbb.openolat.org/bigbluebutton/api/create?name=Test+Meeting&meetingID=abc123&attendeePW=111222&moderatorPW=333444&checksum=1fcbb0c4fc1f039f73aa6d697d2db9ba7f803f17" , url);
 	}
 	
 	@Test
@@ -62,7 +62,7 @@ public class BigBlueButtonUriBuilderTest {
 		       .parameter("moderatorPW", "333444");
 		
 		String url = builder.build().toString();
-		Assert.assertEquals("https://bbb.openolat.org/bigbluebutton/api/create?name=Test+%C3%A9v%C3%A9nement&meetingID=abc123&attendeePW=111222&moderatorPW=333444&checksum=bedc6c6bf6edf42c5ac0f2f3c34cbc8283435029edfa590f43c670e18c4324f9", url);
+		Assert.assertEquals("https://bbb.openolat.org/bigbluebutton/api/create?name=Test+%C3%A9v%C3%A9nement&meetingID=abc123&attendeePW=111222&moderatorPW=333444&checksum=736920ac314bd083e97708e10c778254805967b9", url);
 	}
 
 }