From 30a79e2172f422edf9fffb886edab5462a083bbb Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Mon, 24 Feb 2020 10:33:14 +0100
Subject: [PATCH] OO-4241: Enable course element "Topic assignment" in learning
 path courses

---
 .../course/nodes/ProjectBrokerCourseNode.java | 365 +++++++++---------
 .../ProjectBrokerControllerFactory.java       |   2 +-
 .../ProjectBrokerCourseEditorController.java  |  31 +-
 .../ProjectBrokerLearningPathNodeHandler.java |  80 ++++
 .../_content/edit_condition.html              |  12 -
 .../_i18n/LocalStrings_ar.properties          |   2 -
 .../_i18n/LocalStrings_de.properties          |   5 +-
 .../_i18n/LocalStrings_el.properties          |   3 -
 .../_i18n/LocalStrings_en.properties          |   3 -
 .../_i18n/LocalStrings_fr.properties          |   3 -
 .../_i18n/LocalStrings_it.properties          |   3 -
 .../_i18n/LocalStrings_nl_NL.properties       |   3 -
 .../_i18n/LocalStrings_pl.properties          |   2 -
 .../_i18n/LocalStrings_pt_BR.properties       |   3 -
 .../_i18n/LocalStrings_zh_CN.properties       |   3 -
 15 files changed, 278 insertions(+), 242 deletions(-)
 create mode 100644 src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerLearningPathNodeHandler.java
 delete mode 100644 src/main/java/org/olat/course/nodes/projectbroker/_content/edit_condition.html

diff --git a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
index d8ea39eb0fc..f2a7abef45f 100644
--- a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
@@ -30,7 +30,6 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -59,7 +58,6 @@ import org.olat.core.id.Organisation;
 import org.olat.core.id.Roles;
 import org.olat.core.id.context.BusinessControl;
 import org.olat.core.id.context.BusinessControlFactory;
-import org.olat.core.logging.OLATRuntimeException;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.DirectoryFilter;
 import org.olat.core.util.ExportUtil;
@@ -79,8 +77,7 @@ import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
 import org.olat.core.util.xml.XStreamHelper;
 import org.olat.course.ICourse;
 import org.olat.course.condition.Condition;
-import org.olat.course.condition.interpreter.ConditionExpression;
-import org.olat.course.condition.interpreter.ConditionInterpreter;
+import org.olat.course.editor.ConditionAccessEditConfig;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.editor.NodeEditController;
 import org.olat.course.editor.StatusDescription;
@@ -100,7 +97,6 @@ import org.olat.course.properties.CoursePropertyManager;
 import org.olat.course.properties.PersistingCoursePropertyManager;
 import org.olat.course.run.navigation.NodeRunConstructionResult;
 import org.olat.course.run.userview.CourseNodeSecurityCallback;
-import org.olat.course.run.userview.NodeEvaluation;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupService;
@@ -113,11 +109,11 @@ import org.olat.resource.OLATResource;
 import com.thoughtworks.xstream.XStream;
 
 /**
- *  
- *   @author Christian Guretzki
+ * 
+ * @author Christian Guretzki
  */
 
-public class ProjectBrokerCourseNode extends GenericCourseNode {
+public class ProjectBrokerCourseNode extends AbstractAccessableCourseNode {
 
 	private static final long serialVersionUID = -8177448874150049173L;
 	private static final Logger log = Tracing.createLoggerFor(ProjectBrokerCourseNode.class);
@@ -126,16 +122,16 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 	private transient static final String PACKAGE = Util.getPackageName(ProjectBrokerCourseNode.class);
 
 	public transient static final String TYPE = "projectbroker";
-	
+
 	// NLS support:
-	
+
 	private transient static final String NLS_GUESTNOACCESS_TITLE = "guestnoaccess.title";
 	private transient static final String NLS_GUESTNOACCESS_MESSAGE = "guestnoaccess.message";
 	private transient static final String NLS_ERROR_MISSINGSCORECONFIG_SHORT = "error.missingscoreconfig.short";
 	private transient static final String NLS_WARN_NODEDELETE = "warn.nodedelete";
 
 	// MUST BE NON TRANSIENT
-	private static final int CURRENT_CONFIG_VERSION = 2;
+	private static final int CURRENT_CONFIG_VERSION = 3;
 
 	/** CONF_DROPBOX_ENABLED configuration parameter key. */
 	public transient static final String CONF_DROPBOX_ENABLED = "dropbox_enabled";
@@ -164,28 +160,37 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 	public transient static final String CONF_PROJECTBROKER_KEY = "conf_projectbroker_id";
 
 	public transient static final String CONF_NODE_SHORT_TITLE_KEY = "conf_node_short_title";
-	
+
 	// MUST BE NON TRANSIENT
-	private Condition  conditionDrop, conditionScoring, conditionReturnbox;
-	private Condition  conditionProjectBroker;
+	private Condition conditionDrop, conditionScoring, conditionReturnbox;
+	private Condition conditionProjectBroker;
 
 	public ProjectBrokerCourseNode() {
 		this(null);
 	}
-	
+
 	public ProjectBrokerCourseNode(INode parent) {
 		super(TYPE, parent);
 	}
 
 	@Override
-	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		ProjectBrokerCourseEditorController childTabCntrllr = ProjectBrokerControllerFactory.createCourseEditController(ureq, wControl, course, euce, this );
-		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
-		NodeEditController editController = new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
+	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel,
+			ICourse course, UserCourseEnvironment euce) {
+		ProjectBrokerCourseEditorController childTabCntrllr = ProjectBrokerControllerFactory
+				.createCourseEditController(ureq, wControl, course, euce, this);
+		CourseNode chosenNode = course.getEditorTreeModel()
+				.getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
+		NodeEditController editController = new NodeEditController(ureq, wControl, course, chosenNode, euce,
+				childTabCntrllr);
 		editController.addControllerListener(childTabCntrllr);
 		return editController;
 	}
 
+	@Override
+	public ConditionAccessEditConfig getAccessEditConfig() {
+		return ConditionAccessEditConfig.regular(false);
+	}
+
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
@@ -202,37 +207,40 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 			if (nodecmd != null) {
 				try {
 					Long projectId = Long.valueOf(nodecmd);
-					BusinessControlFactory bcf =  BusinessControlFactory.getInstance();
-					BusinessControl businessControl = bcf.createFromString("[Project:"+projectId+"]");
+					BusinessControlFactory bcf = BusinessControlFactory.getInstance();
+					BusinessControl businessControl = bcf.createFromString("[Project:" + projectId + "]");
 					wControl = bcf.createBusinessWindowControl(businessControl, wControl);
 				} catch (NumberFormatException e) {
 					// ups, nodecmd is not a message, what the heck is it then?
 					log.warn("Could not create message ID from given nodemcd::" + nodecmd, e);
 				}
 			}
-			controller = ProjectBrokerControllerFactory.createRunController(ureq, wControl,userCourseEnv, this);
+			controller = ProjectBrokerControllerFactory.createRunController(ureq, wControl, userCourseEnv, this);
 		}
-		Controller wrapperCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, controller, this, "o_projectbroker_icon");
+		Controller wrapperCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, controller, this,
+				"o_projectbroker_icon");
 		return new NodeRunConstructionResult(wrapperCtrl);
 	}
 
 	@Override
-	public Controller createPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) {
-		return ProjectBrokerControllerFactory.createPreviewController(ureq, wControl,userCourseEnv, this);
+	public Controller createPreviewController(UserRequest ureq, WindowControl wControl,
+			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) {
+		return ProjectBrokerControllerFactory.createPreviewController(ureq, wControl, userCourseEnv, this);
 	}
 
 	@Override
-	public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
-			CourseNodeSecurityCallback nodeSecCallback) {
+	public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl,
+			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) {
 		if (nodeSecCallback.isAccessible()) {
-			Controller peekViewController = ProjectBrokerControllerFactory.createPeekViewRunController(ureq, wControl, userCourseEnv, this);
-			return peekViewController;			
+			Controller peekViewController = ProjectBrokerControllerFactory.createPeekViewRunController(ureq, wControl,
+					userCourseEnv, this);
+			return peekViewController;
 		} else {
 			// use standard peekview
 			return super.createPeekViewRunController(ureq, wControl, userCourseEnv, nodeSecCallback);
 		}
-	}	
-	
+	}
+
 	@Override
 	public RepositoryEntry getReferencedRepositoryEntry() {
 		return null;
@@ -245,12 +253,15 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 
 	@Override
 	public StatusDescription isConfigValid() {
-		if (oneClickStatusCache != null) { return oneClickStatusCache[0]; }
+		if (oneClickStatusCache != null) {
+			return oneClickStatusCache[0];
+		}
 
 		boolean isValid = true;
 		Boolean hasScoring = (Boolean) getModuleConfiguration().get(CONF_SCORING_ENABLED);
 		if (hasScoring.booleanValue()) {
-			if (!MSEditFormController.isConfigValid(getModuleConfiguration())) isValid = false;
+			if (!MSEditFormController.isConfigValid(getModuleConfiguration()))
+				isValid = false;
 		}
 		StatusDescription sd = StatusDescription.NOERROR;
 		if (!isValid) {
@@ -268,38 +279,30 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 	@Override
 	public StatusDescription[] isConfigValid(CourseEditorEnv cev) {
 		oneClickStatusCache = null;
-		// only here we know which translator to take for translating condition error messages
+		// only here we know which translator to take for translating condition error
+		// messages
 		// check if group-manager is already initialized
-		List<StatusDescription> sds = isConfigValidWithTranslator(cev, PACKAGE_PROJECTBROKER, getConditionExpressions());
+		List<StatusDescription> sds = isConfigValidWithTranslator(cev, PACKAGE_PROJECTBROKER,
+				getConditionExpressions());
 		oneClickStatusCache = StatusDescriptionHelper.sort(sds);
 		return oneClickStatusCache;
 	}
 
-	@Override
-	public void calcAccessAndVisibility(ConditionInterpreter ci, NodeEvaluation nodeEval) {
-		if (ci == null) throw new OLATRuntimeException("no condition interpreter <" + getIdent() + " " + getShortName() + ">",
-				new IllegalArgumentException());
-		if (nodeEval == null) throw new OLATRuntimeException("node Evaluationt is null!! for <" + getIdent() + " " + getShortName() + ">",
-				new IllegalArgumentException());
-		// evaluate the preconditions
-		boolean projectBrokerAccess = (getConditionProjectBroker().getConditionExpression() == null ? true : ci.evaluateCondition(conditionProjectBroker));
-		nodeEval.putAccessStatus(ACCESS_PROJECTBROKER, projectBrokerAccess);
-		// add a dummy access-status to open course node in general otherwise the hole project-broker could be closed
-		boolean visible = (getPreConditionVisibility().getConditionExpression() == null ? true : ci
-				.evaluateCondition(getPreConditionVisibility()));
-		nodeEval.setVisible(visible);
-	}
-
 	@Override
 	public String informOnDelete(Locale locale, ICourse course) {
 		Translator trans = new PackageTranslator(PACKAGE_PROJECTBROKER, locale);
 		CoursePropertyManager cpm = PersistingCoursePropertyManager.getInstance(course);
 		List<Property> list = cpm.listCourseNodeProperties(this, null, null, null);
-		if (list.size() != 0) return trans.translate(NLS_WARN_NODEDELETE); // properties exist
-		File fDropboxFolder = new File(FolderConfig.getCanonicalRoot() + DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(), this));
-		if (fDropboxFolder.exists() && fDropboxFolder.list().length > 0) return trans.translate(NLS_WARN_NODEDELETE); // Dropbox folder contains files
-		File fReturnboxFolder = new File(FolderConfig.getCanonicalRoot() + ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(), this));
-		if (fReturnboxFolder.exists() && fReturnboxFolder.list().length > 0) return trans.translate(NLS_WARN_NODEDELETE); // Returnbox folder contains files
+		if (list.size() != 0)
+			return trans.translate(NLS_WARN_NODEDELETE); // properties exist
+		File fDropboxFolder = new File(FolderConfig.getCanonicalRoot()
+				+ DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(), this));
+		if (fDropboxFolder.exists() && fDropboxFolder.list().length > 0)
+			return trans.translate(NLS_WARN_NODEDELETE); // Dropbox folder contains files
+		File fReturnboxFolder = new File(FolderConfig.getCanonicalRoot()
+				+ ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(), this));
+		if (fReturnboxFolder.exists() && fReturnboxFolder.list().length > 0)
+			return trans.translate(NLS_WARN_NODEDELETE); // Returnbox folder contains files
 
 		return null; // no data yet.
 	}
@@ -309,15 +312,18 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 		ProjectBrokerManager projectBrokerManager = CoreSpringFactory.getImpl(ProjectBrokerManager.class);
 		Long projectBrokerId = projectBrokerManager.getProjectBrokerId(cpm, this);
-		File fDropBox = new File(FolderConfig.getCanonicalRoot() + DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(), this));
+		File fDropBox = new File(FolderConfig.getCanonicalRoot()
+				+ DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(), this));
 		if (fDropBox.exists()) {
 			FileUtils.deleteDirsAndFiles(fDropBox, true, true);
 		}
-		File fReturnBox = new File(FolderConfig.getCanonicalRoot() + ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(), this));
+		File fReturnBox = new File(FolderConfig.getCanonicalRoot()
+				+ ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(), this));
 		if (fReturnBox.exists()) {
 			FileUtils.deleteDirsAndFiles(fReturnBox, true, true);
 		}
-		File attachmentDir = new File(FolderConfig.getCanonicalRoot() + projectBrokerManager.getAttachmentBasePathRelToFolderRoot(course.getCourseEnvironment(), this));
+		File attachmentDir = new File(FolderConfig.getCanonicalRoot()
+				+ projectBrokerManager.getAttachmentBasePathRelToFolderRoot(course.getCourseEnvironment(), this));
 		if (attachmentDir.exists()) {
 			FileUtils.deleteDirsAndFiles(attachmentDir, true, true);
 		}
@@ -327,7 +333,7 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 		}
 		// Delete all properties...
 		cpm.deleteNodeProperties(this, null);
-		
+
 		OLATResource resource = course.getCourseEnvironment().getCourseGroupManager().getCourseResource();
 		CoreSpringFactory.getImpl(TaskExecutorManager.class).delete(resource, getIdent());
 	}
@@ -417,9 +423,10 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 	}
 
 	@Override
-	public void postImport(File importDirectory, ICourse course, CourseEnvironmentMapper envMapper, Processing processType) {
+	public void postImport(File importDirectory, ICourse course, CourseEnvironmentMapper envMapper,
+			Processing processType) {
 		// initialize managers
-		if(processType == Processing.editor && importDirectory != null) {
+		if (processType == Processing.editor && importDirectory != null) {
 			ProjectBrokerManager projectBrokerManager = CoreSpringFactory.getImpl(ProjectBrokerManager.class);
 			CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 			// create a new projectBroker
@@ -428,20 +435,21 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 			// get the node folder inside of the importDirectory
 			File folderNodeData = new File(importDirectory, getIdent());
 
-			//for the broker prefs
+			// for the broker prefs
 			File projectBrokerFile = new File(folderNodeData, "projectbroker.xml");
-			if(projectBrokerFile.exists()) {
+			if (projectBrokerFile.exists()) {
 				XStream xstream = XStreamHelper.createXStreamInstance();
 				ProjectGroupManager projectGroupManager = CoreSpringFactory.getImpl(ProjectGroupManager.class);
-				ProjectBrokerConfig brokerConfig = (ProjectBrokerConfig)XStreamHelper.readObject(xstream, projectBrokerFile);
-				if(brokerConfig != null && brokerConfig.getAccountGroupKey() != null) {
+				ProjectBrokerConfig brokerConfig = (ProjectBrokerConfig) XStreamHelper.readObject(xstream,
+						projectBrokerFile);
+				if (brokerConfig != null && brokerConfig.getAccountGroupKey() != null) {
 					Long accountGroupKey = envMapper.toGroupKeyFromOriginalKey(brokerConfig.getAccountGroupKey());
-					if(accountGroupKey != null) {
+					if (accountGroupKey != null) {
 						projectGroupManager.saveAccountManagerGroupKey(accountGroupKey, cpm, this);
 					}
 				}
 			}
-			
+
 			// loop through the project directories
 			if (folderNodeData.exists()) {
 				for (File projectDir : folderNodeData.listFiles(DirectoryFilter.DIRECTORY_FILTER)) {
@@ -453,45 +461,50 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 		}
 		super.postImport(importDirectory, course, envMapper, processType);
 	}
-	
-	private void importProject(File projectDir, File projectFile, ProjectBroker projectBroker, ICourse course, CourseEnvironmentMapper envMapper) {
+
+	private void importProject(File projectDir, File projectFile, ProjectBroker projectBroker, ICourse course,
+			CourseEnvironmentMapper envMapper) {
 		XStream xstream = XStreamHelper.createXStreamInstance();
 		BusinessGroupService bgs = CoreSpringFactory.getImpl(BusinessGroupService.class);
 		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 		ProjectGroupManager projectGroupManager = CoreSpringFactory.getImpl(ProjectGroupManager.class);
 		ProjectBrokerManager projectBrokerManager = CoreSpringFactory.getImpl(ProjectBrokerManager.class);
-		
+
 		// read the projectConfiguration from the importDirectory
 		try {
 			@SuppressWarnings("unchecked")
-			Map<String, Object> projectConfig = (HashMap<String, Object>) XStreamHelper.readObject(xstream, projectFile);
-			String projectTitle = (String)projectConfig.get("title");
-			
+			Map<String, Object> projectConfig = (HashMap<String, Object>) XStreamHelper.readObject(xstream,
+					projectFile);
+			String projectTitle = (String) projectConfig.get("title");
+
 			Long originalGroupKey = null;
-			if(projectConfig.containsKey("businessGroupKey")) {
-				originalGroupKey = (Long)projectConfig.get("businessGroupKey");
+			if (projectConfig.containsKey("businessGroupKey")) {
+				originalGroupKey = (Long) projectConfig.get("businessGroupKey");
 			} else {
-				for(BusinessGroupReference ref:envMapper.getGroups()) {
-					if(ref.getName().endsWith(projectTitle)) {
+				for (BusinessGroupReference ref : envMapper.getGroups()) {
+					if (ref.getName().endsWith(projectTitle)) {
 						originalGroupKey = ref.getOriginalKey();
 					}
 				}
 			}
 
 			BusinessGroup projectGroup = null;
-			if(originalGroupKey != null) {
+			if (originalGroupKey != null) {
 				Long groupKey = envMapper.toGroupKeyFromOriginalKey(originalGroupKey);
 				projectGroup = bgs.loadBusinessGroup(groupKey);
 			}
-			if(projectGroup == null) {
-				projectGroup = projectGroupManager.createProjectGroupFor(projectBroker.getKey(), envMapper.getAuthor(), projectTitle, (String)projectConfig.get("description"), course.getResourceableId());
+			if (projectGroup == null) {
+				projectGroup = projectGroupManager.createProjectGroupFor(projectBroker.getKey(), envMapper.getAuthor(),
+						projectTitle, (String) projectConfig.get("description"), course.getResourceableId());
 			}
-			if(envMapper.getAuthor() != null) {
+			if (envMapper.getAuthor() != null) {
 				Identity author = envMapper.getAuthor();
 				bgs.addOwners(author, null, Collections.singletonList(author), projectGroup, null);
 			}
 
-			Project project = projectBrokerManager.createAndSaveProjectFor(projectTitle, (String)projectConfig.get("description"), projectBrokerManager.getProjectBrokerId(cpm, this), projectGroup);
+			Project project = projectBrokerManager.createAndSaveProjectFor(projectTitle,
+					(String) projectConfig.get("description"), projectBrokerManager.getProjectBrokerId(cpm, this),
+					projectGroup);
 			projectGroupManager.setDeselectionAllowed(project, (boolean) projectConfig.get("allowDeselection"));
 			project.setMailNotificationEnabled((boolean) projectConfig.get("mailNotificationEnabled"));
 			project.setMaxMembers((int) projectConfig.get("maxMembers"));
@@ -507,7 +520,8 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 				File[] attachment = attachmentDir.listFiles();
 				if (attachment.length > 0) {
 					VFSLeaf attachmentLeaf = new LocalFileImpl(attachment[0]);
-					projectBrokerManager.saveAttachedFile(project, projectConfig.get("attachmentFileName").toString(), attachmentLeaf, course.getCourseEnvironment(), this);
+					projectBrokerManager.saveAttachedFile(project, projectConfig.get("attachmentFileName").toString(),
+							attachmentLeaf, course.getCourseEnvironment(), this);
 				}
 			}
 		} catch (Exception e) {
@@ -518,7 +532,8 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 	}
 
 	@Override
-	public void importNode(File importDirectory, ICourse course, Identity owner, Organisation organisation, Locale locale, boolean withReferences) {
+	public void importNode(File importDirectory, ICourse course, Identity owner, Organisation organisation,
+			Locale locale, boolean withReferences) {
 		super.importNode(importDirectory, course, owner, organisation, locale, withReferences);
 	}
 
@@ -530,11 +545,11 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 		ProjectBroker pb = projectBrokerManager.getProjectBroker(projectBrokerManager.getProjectBrokerId(cpm, this));
 		ProjectGroupManager projectGroupManager = CoreSpringFactory.getImpl(ProjectGroupManager.class);
 		XStream xstream = XStreamHelper.createXStreamInstance();
-		
+
 		// folder for the pb node
 		File pbNodeFolder = new File(exportDirectory, getIdent());
 		pbNodeFolder.mkdirs();
-		//for the broker prefs
+		// for the broker prefs
 		ProjectBrokerConfig brokerConfig = new ProjectBrokerConfig();
 		brokerConfig.setAccountGroupKey(projectGroupManager.getAccountManagerGroupKey(cpm, this));
 		File projectBrokerFile = new File(pbNodeFolder, "projectbroker.xml");
@@ -542,7 +557,7 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 
 		// get all the projects available in the pb
 		List<Project> projects = projectBrokerManager.getProjectListBy(pb.getKey());
-		for (Project project:projects) {
+		for (Project project : projects) {
 			File projectFolder = new File(pbNodeFolder, project.getKey().toString());
 			projectFolder.mkdirs();
 			// create a hashmap with the project configuration and insert the
@@ -565,12 +580,15 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 			// writeout the project data
 			XStreamHelper.writeObject(xstream, projectFile, projectData);
 			// add attachment file
-			LocalFolderImpl rootFolder = VFSManager.olatRootContainer(projectBrokerManager.getAttamchmentRelativeRootPath(project, course.getCourseEnvironment(), this), null);
+			LocalFolderImpl rootFolder = VFSManager.olatRootContainer(
+					projectBrokerManager.getAttamchmentRelativeRootPath(project, course.getCourseEnvironment(), this),
+					null);
 			VFSItem item = rootFolder.resolve(project.getAttachmentFileName());
 			if (item instanceof VFSLeaf) {
 				VFSLeaf itemLeaf = (VFSLeaf) item;
 				File attachmentFolder = new File(projectFolder, "attachment");
-				File attachment = new File(attachmentFolder, Base64.encodeBase64String(project.getAttachmentFileName().getBytes()));
+				File attachment = new File(attachmentFolder,
+						Base64.encodeBase64String(project.getAttachmentFileName().getBytes()));
 				try {
 					attachmentFolder.mkdirs();
 					attachment.createNewFile();
@@ -585,27 +603,28 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 			}
 		}
 	}
-	
-	
+
 	@Override
-	public boolean archiveNodeData(Locale locale, ICourse course, ArchiveOptions options,
-			ZipOutputStream exportStream, String archivePath, String charset) {
+	public boolean archiveNodeData(Locale locale, ICourse course, ArchiveOptions options, ZipOutputStream exportStream,
+			String archivePath, String charset) {
 		boolean dataFound = false;
-		String dropboxPath = DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(),this);
+		String dropboxPath = DropboxController.getDropboxPathRelToFolderRoot(course.getCourseEnvironment(), this);
 		VFSContainer dropboxDir = VFSManager.olatRootContainer(dropboxPath, null);
-		String returnboxPath = ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(),this);
+		String returnboxPath = ReturnboxController.getReturnboxPathRelToFolderRoot(course.getCourseEnvironment(), this);
 		VFSContainer returnboxDir = VFSManager.olatRootContainer(returnboxPath, null);
 		if (!dropboxDir.exists() && !returnboxDir.exists()) {
 			return false;
 		}
-		
-		String exportDirName = "projectbroker_" + Formatter.makeStringFilesystemSave(getShortName())
-				  + "_" + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis()));
+
+		String exportDirName = "projectbroker_" + Formatter.makeStringFilesystemSave(getShortName()) + "_"
+				+ Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis()));
 		exportDirName = ZipUtil.concat(archivePath, exportDirName);
 
 		try {
-			String projectBrokerTableExport = ProjectBrokerExportGenerator.createCourseResultsOverviewTable(this, course, locale);
-			String tableExportFileName = ExportUtil.createFileNameWithTimeStamp(getShortTitle() + "-projectbroker_overview", "xls");
+			String projectBrokerTableExport = ProjectBrokerExportGenerator.createCourseResultsOverviewTable(this,
+					course, locale);
+			String tableExportFileName = ExportUtil
+					.createFileNameWithTimeStamp(getShortTitle() + "-projectbroker_overview", "xls");
 			exportStream.putNextEntry(new ZipEntry(exportDirName + "/" + tableExportFileName));
 			IOUtils.write(projectBrokerTableExport, exportStream, "UTF-8");
 			exportStream.closeEntry();
@@ -615,25 +634,30 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 
 		// copy dropboxes to tmp dir
 		if (dropboxDir.exists()) {
-			//OLAT-6426 archive only dropboxes of users that handed in at least one file -> prevent empty folders in archive 
-			for(VFSItem themaItem: dropboxDir.getItems(new VFSSystemItemFilter())) {
-				if (!(themaItem instanceof VFSContainer)) continue;
-				List<VFSItem> userFolderArray = ((VFSContainer)themaItem).getItems(new VFSSystemItemFilter());
-				for (VFSItem userFolder : userFolderArray){
-					if (!VFSManager.isDirectoryAndNotEmpty(userFolder)) continue;
-					String path  = exportDirName + "/dropboxes/" + themaItem.getName();
+			// OLAT-6426 archive only dropboxes of users that handed in at least one file ->
+			// prevent empty folders in archive
+			for (VFSItem themaItem : dropboxDir.getItems(new VFSSystemItemFilter())) {
+				if (!(themaItem instanceof VFSContainer))
+					continue;
+				List<VFSItem> userFolderArray = ((VFSContainer) themaItem).getItems(new VFSSystemItemFilter());
+				for (VFSItem userFolder : userFolderArray) {
+					if (!VFSManager.isDirectoryAndNotEmpty(userFolder))
+						continue;
+					String path = exportDirName + "/dropboxes/" + themaItem.getName();
 					ZipUtil.addToZip(userFolder, path, exportStream);
 				}
 			}
 		}
-			
+
 		// copy returnboxes to tmp dir
 		if (returnboxDir.exists()) {
-			for (VFSItem themaItem:returnboxDir.getItems(new VFSSystemItemFilter())) {
-				if (!(themaItem instanceof VFSContainer)) continue;
-				List<VFSItem> userFolderArray = ((VFSContainer)themaItem).getItems(new VFSSystemItemFilter());
-				for (VFSItem userFolder : userFolderArray){
-					if (!VFSManager.isDirectoryAndNotEmpty(userFolder)) continue;
+			for (VFSItem themaItem : returnboxDir.getItems(new VFSSystemItemFilter())) {
+				if (!(themaItem instanceof VFSContainer))
+					continue;
+				List<VFSItem> userFolderArray = ((VFSContainer) themaItem).getItems(new VFSSystemItemFilter());
+				for (VFSItem userFolder : userFolderArray) {
+					if (!VFSManager.isDirectoryAndNotEmpty(userFolder))
+						continue;
 					String path = exportDirName + "/returnboxes/" + themaItem.getName();
 					ZipUtil.addToZip(userFolder, path, exportStream);
 				}
@@ -643,26 +667,6 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 		return dataFound;
 	}
 
-	@Override
-	public List<ConditionExpression> getConditionExpressions() {
-		List<ConditionExpression> retVal;
-		List<ConditionExpression> parentsConditions = super.getConditionExpressions();
-		if (parentsConditions.size() > 0) {
-			retVal = new ArrayList<>(parentsConditions);
-		} else {
-			retVal = new ArrayList<>();
-		}
-
-		String condition = getConditionProjectBroker().getConditionExpression();
-		if (condition != null && !condition.equals("")) {
-			// an active condition is defined
-			ConditionExpression ce = new ConditionExpression(getConditionProjectBroker().getConditionId());
-			ce.setExpressionString(getConditionProjectBroker().getConditionExpression());
-			retVal.add(ce);
-		}
-		return retVal;
-	}
-
 	@Override
 	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
@@ -690,11 +694,16 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 					this.setConditionReturnbox(null);
 					version = 2;
 				}
+				if (version < 3) {
+					setPreConditionAccess(conditionProjectBroker);
+					conditionProjectBroker = null;
+					conditionScoring = null;
+				}
 				config.setConfigurationVersion(CURRENT_CONFIG_VERSION);
 			}
 		}
 	}
-	
+
 	@Override
 	protected void postImportCopyConditions(CourseEnvironmentMapper envMapper) {
 		super.postImportCopyConditions(envMapper);
@@ -714,47 +723,51 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 	}
 
 	/**
-	 * Do re-arrange the projects in a new project broker after the copy happened 
+	 * Do re-arrange the projects in a new project broker after the copy happened
 	 */
-    @Override
-    public void postCopy(CourseEnvironmentMapper envMapper, Processing processType, ICourse course, ICourse sourceCourse) {
-    	super.postCopy(envMapper, processType, course, null);
-	    if(processType.equals(Processing.runstructure)) {
-	    	//initialize the managers and services
+	@Override
+	public void postCopy(CourseEnvironmentMapper envMapper, Processing processType, ICourse course,
+			ICourse sourceCourse) {
+		super.postCopy(envMapper, processType, course, null);
+		if (processType.equals(Processing.runstructure)) {
+			// initialize the managers and services
 			ProjectBrokerManager projectBrokerManager = CoreSpringFactory.getImpl(ProjectBrokerManager.class);
 			ProjectGroupManager projectGroupManager = CoreSpringFactory.getImpl(ProjectGroupManager.class);
 			CoursePropertyManager oldCpm = sourceCourse.getCourseEnvironment().getCoursePropertyManager();
 			BusinessGroupService bgs = CoreSpringFactory.getImpl(BusinessGroupService.class);
-			//create new Project broker and get the old one
+			// create new Project broker and get the old one
 			Long projectBrokerId = projectBrokerManager.createAndSaveProjectBroker().getKey();
-			projectBrokerManager.saveProjectBrokerId(projectBrokerId, course.getCourseEnvironment().getCoursePropertyManager(), this);
-			
-			//find the group for account manager and remap the account group
+			projectBrokerManager.saveProjectBrokerId(projectBrokerId,
+					course.getCourseEnvironment().getCoursePropertyManager(), this);
+
+			// find the group for account manager and remap the account group
 			CourseNode sourceCourseNode = sourceCourse.getRunStructure().getNode(getIdent());
 			Long sourceAccountGroupKey = projectGroupManager.getAccountManagerGroupKey(oldCpm, sourceCourseNode);
-			if(sourceAccountGroupKey != null) {
+			if (sourceAccountGroupKey != null) {
 				Long copiedGroupKey = envMapper.toGroupKeyFromOriginalKey(sourceAccountGroupKey);
 				CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 				projectGroupManager.saveAccountManagerGroupKey(copiedGroupKey, cpm, this);
-			} 
+			}
 
 			Long oldBrokerId = projectBrokerManager.getProjectBrokerId(oldCpm, this);
 			List<Project> projectsFromGroup = projectBrokerManager.getProjectListBy(oldBrokerId);
-			//loop create and configure the new Projects
-			for(Project project : projectsFromGroup){
+			// loop create and configure the new Projects
+			for (Project project : projectsFromGroup) {
 				Long originalGroupKey = project.getProjectGroup().getKey();
 				Long copiedGroupKey = envMapper.toGroupKeyFromOriginalKey(originalGroupKey);
-				
+
 				Identity author = envMapper.getAuthor();
 				BusinessGroup projectGroup = bgs.loadBusinessGroup(copiedGroupKey);
 				if (projectGroup == null) {
-					projectGroup = projectGroupManager.createProjectGroupFor(projectBrokerId, author, project.getTitle(), project.getDescription(), course.getResourceableId());
+					projectGroup = projectGroupManager.createProjectGroupFor(projectBrokerId, author,
+							project.getTitle(), project.getDescription(), course.getResourceableId());
 				}
-				if(author != null) {
+				if (author != null) {
 					bgs.addOwners(author, null, Collections.singletonList(author), projectGroup, null);
 				}
-				
-				Project newProject = projectBrokerManager.createAndSaveProjectFor(project.getTitle(), project.getDescription(), projectBrokerId, projectGroup);
+
+				Project newProject = projectBrokerManager.createAndSaveProjectFor(project.getTitle(),
+						project.getDescription(), projectBrokerId, projectGroup);
 				// copy all project configurations
 				newProject.setMailNotificationEnabled(project.isMailNotificationEnabled());
 				newProject.setMaxMembers(project.getMaxMembers());
@@ -764,17 +777,19 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 				projectGroupManager.setDeselectionAllowed(newProject, project.getProjectGroup().isAllowToLeave());
 				projectBrokerManager.updateProject(newProject);
 				// attachment file
-				VFSContainer rootFolder = VFSManager.olatRootContainer(projectBrokerManager.getAttamchmentRelativeRootPath(project, sourceCourse.getCourseEnvironment(), this), null);
+				VFSContainer rootFolder = VFSManager.olatRootContainer(projectBrokerManager
+						.getAttamchmentRelativeRootPath(project, sourceCourse.getCourseEnvironment(), this), null);
 				VFSItem item = rootFolder.resolve(project.getAttachmentFileName());
 				if (item instanceof VFSLeaf) {
-					projectBrokerManager.saveAttachedFile(newProject, project.getAttachmentFileName(), (VFSLeaf) item, course.getCourseEnvironment(), this);
+					projectBrokerManager.saveAttachedFile(newProject, project.getAttachmentFileName(), (VFSLeaf) item,
+							course.getCourseEnvironment(), this);
 					newProject.setAttachedFileName(project.getAttachmentFileName());
 					projectBrokerManager.updateProject(newProject);
 				}
 			}
-	    }
+		}
 	}
-	
+
 	@Override
 	public CourseNode createInstanceForCopy(boolean isNewTitle, ICourse course, Identity author) {
 		// create the instance for the copy
@@ -784,35 +799,39 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 		ProjectGroupManager projectGroupManager = CoreSpringFactory.getImpl(ProjectGroupManager.class);
 		ProjectBrokerManager projectBrokerManager = CoreSpringFactory.getImpl(ProjectBrokerManager.class);
-		
+
 		// get the pbID from the source pb
 		Long oldProjectBrokerId = projectBrokerManager.getProjectBrokerId(cpm, this);
 		// create a new projectBroker for the copyInstance
 		ProjectBroker newBroker = projectBrokerManager.createAndSaveProjectBroker();
 		Long projectBrokerId = newBroker.getKey();
 		projectBrokerManager.saveProjectBrokerId(projectBrokerId, cpm, copyInstance);
-		
-		
+
 		// configure the new Project like the old one
 		// copy the old accountManagergroup to preserve the
 		// "persons in charge"
 		Long originalAccountGroupKey = projectGroupManager.getAccountManagerGroupKey(cpm, this);
-		if(originalAccountGroupKey != null) {
-			BusinessGroup originalAccountGroup = projectGroupManager.getAccountManagerGroupFor(cpm, this, course, getShortTitle(), getShortTitle(), null);
+		if (originalAccountGroupKey != null) {
+			BusinessGroup originalAccountGroup = projectGroupManager.getAccountManagerGroupFor(cpm, this, course,
+					getShortTitle(), getShortTitle(), null);
 			BusinessGroup newAccountManagerGroup = bgs.copyBusinessGroup(author, originalAccountGroup,
 					originalAccountGroup.getName(), originalAccountGroup.getDescription(),
-					originalAccountGroup.getMinParticipants(), originalAccountGroup.getMaxParticipants(), false, false, true, false, false, true, false, false);
+					originalAccountGroup.getMinParticipants(), originalAccountGroup.getMaxParticipants(), false, false,
+					true, false, false, true, false, false);
 			projectGroupManager.saveAccountManagerGroupKey(newAccountManagerGroup.getKey(), cpm, copyInstance);
-			bgs.addResourceTo(newAccountManagerGroup, course.getCourseEnvironment().getCourseGroupManager().getCourseEntry());
+			bgs.addResourceTo(newAccountManagerGroup,
+					course.getCourseEnvironment().getCourseGroupManager().getCourseEntry());
 		}
-		
+
 		if (oldProjectBrokerId != null) {
 			List<Project> projects = projectBrokerManager.getProjectListBy(oldProjectBrokerId);
-			for (Project project: projects) {
+			for (Project project : projects) {
 				// create projectGroup
-				BusinessGroup projectGroup = projectGroupManager.createProjectGroupFor(projectBrokerId, author, project.getTitle(), project.getDescription(), course.getResourceableId());
-				Project newProject = projectBrokerManager.createAndSaveProjectFor(project.getTitle(), project.getDescription(), projectBrokerId, projectGroup);
-				
+				BusinessGroup projectGroup = projectGroupManager.createProjectGroupFor(projectBrokerId, author,
+						project.getTitle(), project.getDescription(), course.getResourceableId());
+				Project newProject = projectBrokerManager.createAndSaveProjectFor(project.getTitle(),
+						project.getDescription(), projectBrokerId, projectGroup);
+
 				// copy all project configurations
 				newProject.setMailNotificationEnabled(project.isMailNotificationEnabled());
 				newProject.setMaxMembers(project.getMaxMembers());
@@ -823,10 +842,12 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 				projectBrokerManager.updateProject(newProject);
 
 				// attachment file
-				VFSContainer rootFolder = VFSManager.olatRootContainer(projectBrokerManager.getAttamchmentRelativeRootPath(project, course.getCourseEnvironment(), this), null);
+				VFSContainer rootFolder = VFSManager.olatRootContainer(projectBrokerManager
+						.getAttamchmentRelativeRootPath(project, course.getCourseEnvironment(), this), null);
 				VFSItem item = rootFolder.resolve(project.getAttachmentFileName());
 				if (item instanceof VFSLeaf) {
-					projectBrokerManager.saveAttachedFile(newProject, project.getAttachmentFileName(), (VFSLeaf) item, course.getCourseEnvironment(), copyInstance);
+					projectBrokerManager.saveAttachedFile(newProject, project.getAttachmentFileName(), (VFSLeaf) item,
+							course.getCourseEnvironment(), copyInstance);
 					newProject.setAttachedFileName(project.getAttachmentFileName());
 					projectBrokerManager.updateProject(newProject);
 				}
@@ -834,7 +855,7 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 		}
 		return copyInstance;
 	}
-	
+
 	public static class ProjectBrokerConfig implements Serializable {
 
 		private static final long serialVersionUID = -1002067261836601966L;
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerControllerFactory.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerControllerFactory.java
index e85a2afec68..c2fa29bf78f 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerControllerFactory.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerControllerFactory.java
@@ -42,7 +42,7 @@ import org.olat.course.run.userview.UserCourseEnvironment;
 public class ProjectBrokerControllerFactory {
 
 	public static ProjectBrokerCourseEditorController createCourseEditController(UserRequest ureq, WindowControl wControl, ICourse course, UserCourseEnvironment euce, ProjectBrokerCourseNode projectBrokerCourseNode) {
-		return new ProjectBrokerCourseEditorController(ureq, wControl, course, projectBrokerCourseNode, euce);
+		return new ProjectBrokerCourseEditorController(ureq, wControl, course, projectBrokerCourseNode);
 	}
 
 	public static Controller createRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNode courseNode) {
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java
index d8a9464bed2..34a39592c45 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java
@@ -57,7 +57,6 @@ import org.olat.core.util.vfs.VFSManager;
 import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
-import org.olat.course.assessment.AssessmentHelper;
 import org.olat.course.auditing.UserNodeAuditManager;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.NodeEditController;
@@ -71,7 +70,6 @@ import org.olat.course.nodes.projectbroker.service.ProjectBrokerModuleConfigurat
 import org.olat.course.nodes.projectbroker.service.ProjectGroupManager;
 import org.olat.course.nodes.ta.DropboxForm;
 import org.olat.course.properties.CoursePropertyManager;
-import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.group.BusinessGroup;
 import org.olat.group.BusinessGroupAddResponse;
 import org.olat.group.BusinessGroupService;
@@ -89,12 +87,10 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef
 
 	public static final String PANE_TAB_CONF_DROPBOX        = "pane.tab.conf.dropbox";
 	public static final String PANE_TAB_CONF_MODULES        = "pane.tab.conf.modules";
-	public static final String PANE_TAB_ACCESSIBILITY       = "pane.tab.accessibility";
 	private static final String PANE_TAB_OPTIONS            = "pane.tab.options";
 	private static final String PANE_TAB_ACCOUNT_MANAGEMENT = "pane.tab.accountmanagement";
 	
-	private static final String[] paneKeys = { PANE_TAB_CONF_DROPBOX, PANE_TAB_CONF_MODULES,
-			PANE_TAB_ACCESSIBILITY };
+	private static final String[] paneKeys = { PANE_TAB_CONF_DROPBOX, PANE_TAB_CONF_MODULES };
 
 
 	private Long courseId;
@@ -103,7 +99,7 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef
 	private ProjectBrokerModuleConfiguration projectBrokerModuleConfiguration;
 	private BusinessGroup accountManagerGroup;
 
-	private VelocityContainer accessabilityVC, optionsFormVC, accountManagementFormVC;
+	private VelocityContainer optionsFormVC, accountManagementFormVC;
 	private VelocityContainer editModules, editDropbox, editScoring;
 	private TabbedPane myTabbedPane;
 	private int dropboxTabPosition;
@@ -135,15 +131,7 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef
 	@Autowired
 	private ProjectGroupManager projectGroupManager;
 	
-	/**
-	 * @param ureq
-	 * @param wControl
-	 * @param course
-	 * @param node
-	 * @param groupMgr
-	 */
-	protected ProjectBrokerCourseEditorController(UserRequest ureq, WindowControl wControl, ICourse course, ProjectBrokerCourseNode node,
-			UserCourseEnvironment euce) {
+	protected ProjectBrokerCourseEditorController(UserRequest ureq, WindowControl wControl, ICourse course, ProjectBrokerCourseNode node) {
 		super(ureq, wControl);
 
 		this.node = node;
@@ -164,15 +152,6 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef
 			projectBrokerId = projectBroker.getKey();
 			projectBrokerManager.saveProjectBrokerId(projectBrokerId, cpm, node);
 		} 
-	
-		// Access
-		accessabilityVC = this.createVelocityContainer("edit_condition");
-		// ProjectBroker precondition
-		projectBrokerConditionController = new ConditionEditController(ureq, getWindowControl(), euce, node.getConditionProjectBroker(),
-				AssessmentHelper.getAssessableNodes(course.getEditorTreeModel(), node));		
-		this.listenTo(projectBrokerConditionController);
-		accessabilityVC.put("projectBrokerCondition", projectBrokerConditionController.getInitialComponent());
-
 		
 		// Options with dates and custom-fields		
     optionsFormVC = this.createVelocityContainer("optionsForm");
@@ -354,7 +333,6 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef
 	@Override
 	public void addTabs(TabbedPane theTabbedPane) {
 		this.myTabbedPane = theTabbedPane;
-		myTabbedPane.addTab(translate(PANE_TAB_ACCESSIBILITY), accessabilityVC);
 		myTabbedPane.addTab(translate(PANE_TAB_OPTIONS), optionsFormVC);
 		myTabbedPane.addTab(translate(PANE_TAB_ACCOUNT_MANAGEMENT), accountManagementFormVC);
 		myTabbedPane.addTab(translate(PANE_TAB_CONF_MODULES), editModules);
@@ -364,9 +342,6 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef
 		myTabbedPane.setEnabled(dropboxTabPosition, (bool != null) ? bool.booleanValue() : true);
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
 	@Override
 	protected void doDispose() {
     	//
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerLearningPathNodeHandler.java
new file mode 100644
index 00000000000..b89ba6b0822
--- /dev/null
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerLearningPathNodeHandler.java
@@ -0,0 +1,80 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.course.nodes.projectbroker;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.course.learningpath.LearningPathConfigs;
+import org.olat.course.learningpath.LearningPathEditConfigs;
+import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
+import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
+import org.olat.course.nodes.CourseNode;
+import org.olat.course.nodes.ProjectBrokerCourseNode;
+import org.olat.repository.RepositoryEntry;
+import org.springframework.stereotype.Service;
+
+/**
+ * 
+ * Initial date: 24.02.2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+@Service
+public class ProjectBrokerLearningPathNodeHandler implements LearningPathNodeHandler {
+
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.build();
+	
+	@Override
+	public String acceptCourseNodeType() {
+		return ProjectBrokerCourseNode.TYPE;
+	}
+
+	@Override
+	public boolean isSupported() {
+		return true;
+	}
+
+	@Override
+	public LearningPathConfigs getConfigs(CourseNode courseNode) {
+		return new ModuleLearningPathConfigs(courseNode.getModuleConfiguration(), true);
+	}
+
+	@Override
+	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
+			CourseNode courseNode) {
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode, EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
+	}
+
+	@Override
+	public void onMigrated(CourseNode courseNode) {
+		//
+	}
+
+}
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_content/edit_condition.html b/src/main/java/org/olat/course/nodes/projectbroker/_content/edit_condition.html
deleted file mode 100644
index 6e7428817bd..00000000000
--- a/src/main/java/org/olat/course/nodes/projectbroker/_content/edit_condition.html
+++ /dev/null
@@ -1,12 +0,0 @@
-#if ($r.available("projectBrokerCondition"))
-<fieldset class="clearfix">
-	<legend>$r.contextHelpWithWrapper("General Configuration of Course Elements#_zugang")
-	$r.translate("projectbroker.condition.title")</legend>
-	$r.render("projectBrokerCondition")
-</fieldset>
-#end
-
-#if ( !($r.available("projectBrokerCondition"))  )
-	$r.translate("no.condition.available")
-#end
-
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_ar.properties
index b40ec4320bf..bceed284f4c 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_ar.properties
+++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_ar.properties
@@ -175,9 +175,7 @@ mail.remove.candidate.subject=$projectTitle $\:projectbroker.themaSg \u0644\u064
 mail.remove.participant.body=*** \u0647\u0630\u0647 \u0631\u0633\u0627\u0644\u0629 \u062A\u0644\u0642\u0627\u0626\u064A\u0629\u060C \u0645\u0646 \u0641\u0636\u0644\u0643 \u0644\u0627 \u062A\u0631\u062F \u0639\u0644\u064A\u0647\u0627 ***\r\n\r\n($firstnameProjectManager $lastnameProjectManager , \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 \= $usernameProjectManager) \u0645\u0624\u0644\u0641 \u0627\u0644\u0645\u0648\u0636\u0648\u0639\r\n .$currentDate \u0641\u0649 $projectTitle $\:projectbroker.themaSg  \u0642\u0627\u0645 \u0628\u062A\u0633\u062C\u064A\u0644 \u062E\u0631\u0648\u062C\u0643 \u0643\u0645\u0634\u0627\u0631\u0643 \u0645\u0646
 mail.remove.participant.subject=$projectTitle \: $\:projectbroker.themaSg \u062A\u0633\u062C\u064A\u0644 \u0627\u0644\u062E\u0631\u0648\u062C \u0644\u0644\u0645\u0634\u0627\u0631\u0643\u064A\u0646 \u0645\u0646
 new.project.title=\u062C\u062F\u064A\u062F $\:projectbroker.themaSg
-no.condition.available=\u0644\u0645 \u064A\u062A\u0645 \u0639\u0645\u0644 \u0623\u0649 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0644\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062C\u0632\u0626\u064A\u0629\u060C \u0648\u0644\u0630\u0644\u0643 \u0644\u0627 \u064A\u0645\u0643\u0646 \u0639\u0645\u0644 \u0623\u0649 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0644\u0644\u0648\u0635\u0648\u0644.
 no.folder.available=\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u0631\u0628\u0639\u0627\u062A \u0625\u0641\u0644\u0627\u062A \u0623\u0648 \u0631\u062C\u0648\u0639 \u062A\u062D\u062A \u062A\u0635\u0631\u0641\u0643.
-pane.tab.accessibility=\u0648\u0635\u0648\u0644
 pane.tab.accountmanagement=\u0627\u0644\u0645\u0633\u0626\u0648\u0644
 pane.tab.conf.dropbox=\u062D\u062A\u0649 \u062A\u0627\u0631\u064A\u062E
 pane.tab.conf.modules=\u0627\u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u062C\u0632\u0626\u064A\u0629
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties
index 8f5fd389dc1..bfaa6555f16 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_de.properties
@@ -90,7 +90,7 @@ detailsform.mail.notification.label=E-Mail-Benachrichtigung bei $\:projectbroker
 detailsform.max.candidates.label=Anzahl Bewerber limitieren?
 detailsform.max.members.label=Anzahl Pl\u00E4tze limitieren?
 detailsform.allow.deselection=Abmelden von Thema erlauben?
-detailsform.allow.deselection.hint=(nach Ablauf des Einschreibedatum ist eine Abmeldung nicht mehr m\u00f6glich)
+detailsform.allow.deselection.hint=(nach Ablauf des Einschreibedatum ist eine Abmeldung nicht mehr m\u00F6glich)
 detailsform.places.candidates.label=Anzahl Bewerber (belegt/total)
 detailsform.places.label=Anzahl Pl\u00E4tze (belegt/total)
 detailsform.places.of=von
@@ -190,9 +190,7 @@ mail.remove.candidate.subject=Bewerbung f\u00FCr das Thema $projectTitle nicht b
 mail.remove.participant.body=*** Das ist eine automatisch generierte Nachricht. Bitte antworten Sie nicht auf diese Nachricht *** \n\nDer/die Themenverantwortliche $firstnameProjectManager $lastnameProjectManager (OLAT-Benutzername "$usernameProjectManager") hat Sie am $currentDate als Teilnehmer/in aus dem Thema "$projectTitle" ausgetragen.
 mail.remove.participant.subject=Austragung Teilnehmer f\u00FCr das Thema $projectTitle
 new.project.title=Neues $\:projectbroker.themaSg
-no.condition.available=Es sind keine Teilbausteine konfiguriert. Daher kann der Zugang nicht konfiguriert werden.
 no.folder.available=Es stehen keine Abgabe- und R\u00FCckgabeordner zur Verf\u00FCgung.
-pane.tab.accessibility=Zugang
 pane.tab.accountmanagement=Verantwortliche
 pane.tab.conf.dropbox=Abgabe
 pane.tab.conf.modules=Teilbausteine
@@ -210,7 +208,6 @@ project.deleted.msg=Das Thema $\:projectbroker.themaSg `{0}` wurde gel\u00F6scht
 project.folder.not.participant=Die $\:tab.project.folder k\u00F6nnen nicht angezeigt werden, da Sie sich entweder nicht f\u00FCr das $\:projectbroker.themaSg eingeschrieben haben oder der Themenverantwortliche Sie noch nicht als definitiver Teilnehmer akzeptiert hat.
 project.member.groupdescription=Gruppe zum $\:projectbroker.themaSg {0}, automatisch erstellt. 
 project.member.groupname=$\:projectbroker.themaSg {0}
-projectbroker.condition.title=Allgemeiner Themenvergabe-Zugang
 projectgroup.candidates.message=Bitte tragen sie nach dem Akzeptieren der gew\u00FCnschten Bewerber die nicht ber\u00FCcksichtigten Kandidaten aus der Liste aus.
 projectgroup.candidates.title=Kandidaten
 projectgroup.member.title=Akzeptierte Teilnehmer
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_el.properties
index f8bccb938f2..a1580dda5e3 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_el.properties
+++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_el.properties
@@ -147,9 +147,7 @@ mail.remove.candidate.subject=\u0397 \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AE
 mail.remove.participant.body=*** \u03A4\u03BF \u03C0\u03B1\u03C1\u03CC\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AD\u03BD\u03B1 \u03B1\u03C5\u03C4\u03BF\u03BC\u03B1\u03C4\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03BF \u03BC\u03AE\u03BD\u03C5\u03BC\u03B1. \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03CE \u03BC\u03B7\u03BD \u03B1\u03C0\u03B1\u03BD\u03C4\u03AE\u03C3\u03B5\u03C4\u03B5 ***\r\n\r\n\u039F \u03C3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AD\u03B1\u03C2 \u03B8\u03AD\u03BC\u03B1\u03C4\u03BF\u03C2 ($firstnameProjectManager $lastnameProjectManager, \u03BC\u03B5 \u03CC\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 $usernameProjectManager) \u03B1\u03C0\u03AD\u03C3\u03C5\u03C1\u03B5 \u03C4\u03B7\u03BD \u03C3\u03C5\u03BC\u03BC\u03B5\u03C4\u03BF\u03C7\u03AE \u03C3\u03B1\u03C2 \u03B1\u03C0\u03BF \u03C4\u03BF $\:projectbroker.themaSg $projectTitle \u03C3\u03C4\u03B9\u03C2 $currentDate .
 mail.remove.participant.subject=\u0391\u03C0\u03BF\u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03C3\u03C5\u03BC\u03BC\u03B5\u03C4\u03B5\u03C7\u03CC\u03BD\u03C4\u03C9\u03BD \u03B1\u03C0\u03CC \u03C4\u03BF $\:projectbroker.themaSg \: $projectTitle
 new.project.title=\u039D\u03AD\u03BF $\:projectbroker.themaSg
-no.condition.available=\u0394\u03B5\u03BD \u03AD\u03C7\u03BF\u03C5\u03BD \u03B4\u03B9\u03B1\u03BC\u03BF\u03C1\u03C6\u03C9\u03B8\u03B5\u03AF \u03B5\u03C0\u03AF \u03BC\u03AD\u03C1\u03BF\u03C5\u03C2 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1. \u03A3\u03C5\u03BD\u03B5\u03C0\u03CE\u03C2, \u03B4\u03B5 \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF\u03C4\u03B5 \u03BD\u03B1 \u03B4\u03B9\u03B1\u03BC\u03BF\u03C1\u03C6\u03CE\u03C3\u03B5\u03C4\u03B5 \u03BA\u03AC\u03C0\u03BF\u03B9\u03B1 \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7.
 no.folder.available=\u0394\u03B5\u03BD \u03C5\u03C0\u03AC\u03C1\u03C7\u03BF\u03C5\u03BD \u03B8\u03C5\u03C1\u03AF\u03B4\u03B5\u03C2 \u03C0\u03B1\u03C1\u03AC\u03B4\u03BF\u03C3\u03B7\u03C2 \u03AE \u03B5\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE\u03C2 \u03C3\u03C4\u03B7 \u03B4\u03B9\u03AC\u03B8\u03B5\u03C3\u03AE \u03C3\u03B1\u03C2.
-pane.tab.accessibility=\u03A0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7
 pane.tab.accountmanagement=\u03A5\u03C0\u03B5\u03CD\u03B8\u03C5\u03BD\u03BF\u03B9
 pane.tab.conf.dropbox=\u03A0\u03C1\u03BF\u03B8\u03B5\u03C3\u03BC\u03AF\u03B1
 pane.tab.conf.modules=\u0395\u03C0\u03AF \u03BC\u03AD\u03C1\u03BF\u03C5\u03C2 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1
@@ -165,7 +163,6 @@ project.deleted.msg=$\:projectbroker.themaSg `{0}` \u03B4\u03B9\u03B5\u03B3\u03C
 project.folder.not.participant=\u039F $\:tab.project.folder \u03B1\u03C5\u03C4\u03CC\u03C2 \u03B4\u03B5\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03B4\u03C5\u03BD\u03B1\u03C4\u03CC \u03BD\u03B1 \u03C0\u03C1\u03BF\u03B2\u03BB\u03B7\u03B8\u03B5\u03AF \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03BF\u03C5 \u03CC\u03C4\u03B9 \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03C4\u03B5 \u03B5\u03B3\u03B3\u03C1\u03B1\u03C6\u03B5\u03AF \u03C3\u03C4\u03BF $\:projectbroker.themaSg \u03AE \u03BF \u03C3\u03C5\u03B3\u03B3\u03C1\u03B1\u03C6\u03AD\u03B1\u03C2 \u03B8\u03AD\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B4\u03B5 \u03C3\u03B1\u03C2 \u03AD\u03C7\u03B5\u03B9 \u03B1\u03C0\u03BF\u03B4\u03B5\u03C7\u03C4\u03B5\u03AF \u03C9\u03C2 \u03C3\u03C5\u03BC\u03BC\u03B5\u03C4\u03AD\u03C7\u03C9\u03BD.
 project.member.groupdescription=\u0397 \u03BF\u03BC\u03AC\u03B4\u03B1 \u03C3\u03C7\u03B5\u03C4\u03B9\u03BA\u03AC \u03BC\u03B5 \u03C4\u03BF $\:projectbroker.themaSg {0}, \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03B8\u03B7\u03BA\u03B5 \u03B1\u03C5\u03C4\u03CC\u03BC\u03B1\u03C4\u03B1.
 project.member.groupname=$\:projectbroker.themaSg {0}
-projectbroker.condition.title=\u0393\u03B5\u03BD\u03B9\u03BA\u03AE \u03C0\u03C1\u03CC\u03C3\u03B2\u03B1\u03C3\u03B7 \u03C3\u03B5 \u03B1\u03BD\u03B1\u03B8\u03AD\u03C3\u03B5\u03B9\u03C2 \u03B8\u03B5\u03BC\u03AC\u03C4\u03C9\u03BD
 projectgroup.candidates.title=\u03A5\u03C0\u03BF\u03C8\u03AE\u03C6\u03B9\u03BF\u03B9
 projectgroup.member.title=\u0391\u03C0\u03BF\u03B4\u03B5\u03BA\u03C4\u03BF\u03AF \u03C3\u03C5\u03BC\u03BC\u03B5\u03C4\u03AD\u03C7\u03BF\u03BD\u03C4\u03B5\u03C2
 projectgroup.projectleader.title=\u03A3\u03C5\u03BD\u03C4\u03AC\u03BA\u03C4\u03B5\u03C2 \u03B8\u03AD\u03BC\u03B1\u03C4\u03BF\u03C2
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_en.properties
index 2294ddee60a..09d777b7742 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_en.properties
@@ -190,9 +190,7 @@ mail.remove.candidate.subject=Registration for topic $projectTitle not accepted
 mail.remove.participant.body=*** This is an automated message. Please do not reply ***\r\n\r\nThe topic author $firstnameProjectManager $lastnameProjectManager (OLAT user name "$usernameProjectManager") has signed you out as participant from the topic "$projectTitle" on $currentDate
 mail.remove.participant.subject=Signing out of participants from topic $projectTitle
 new.project.title=New $\:projectbroker.themaSg
-no.condition.available=No partial elements configured. Therefore you cannot configure any access.
 no.folder.available=There are no drop or return boxes at your disposal.
-pane.tab.accessibility=Access
 pane.tab.accountmanagement=Persons in charge
 pane.tab.conf.dropbox=Due date
 pane.tab.conf.modules=Partial elements
@@ -210,7 +208,6 @@ project.deleted.msg=$\:projectbroker.themaSg `{0}` deleted
 project.folder.not.participant=This $\:tab.project.folder cannot be displayed since you are not registered for this $\:projectbroker.themaSg or the topic author has not yet accepted you as participant.
 project.member.groupdescription=Group regarding the $\:projectbroker.themaSg {0} created automatically.
 project.member.groupname=$\:projectbroker.themaSg {0}
-projectbroker.condition.title=General access to topic assignments
 projectgroup.candidates.message=Please delist those candidates that could not be accepted after selecting the designated ones.
 projectgroup.candidates.title=Candidates
 projectgroup.member.title=Participants accepted
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_fr.properties
index 46885715d7b..1cb3984d709 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_fr.properties
@@ -190,9 +190,7 @@ mail.remove.candidate.subject=Candidature pour le sujet $projectTitle non accept
 mail.remove.participant.body=*** Ceci est un message g\u00E9n\u00E9r\u00E9 automatiquement. Veuillez ne pas r\u00E9pondre \u00E0 ce message.***\r\n\r\nLe/s responsables de sujet $firstnameProjectManager $lastnameProjectManager (nom d'utililsateur OLAT "$usernameProjectManager") vous a/ont d\u00E9sinscrit comme participant au sujet "$projectTitle" le $currentDate.
 mail.remove.participant.subject=D\u00E9sinscription comme participant au sujet $projectTitle
 new.project.title=Nouveau $\:projectbroker.themaSg
-no.condition.available=Il n'y a pas d'\u00E9l\u00E9ments partiels configur\u00E9s, donc l'acc\u00E8s ne peut pas \u00EAtre configur\u00E9.
 no.folder.available=Il n'y a pas de bo\u00EEte de d\u00E9pot ou de restitution.
-pane.tab.accessibility=Acc\u00E8s
 pane.tab.accountmanagement=Responsables
 pane.tab.conf.dropbox=D\u00E9p\u00F4t
 pane.tab.conf.modules=El\u00E9ments partiels
@@ -210,7 +208,6 @@ project.deleted.msg=Le sujet $\:projectbroker.themaSg `{0}` a \u00E9t\u00E9 effa
 project.folder.not.participant=Le $\:tab.project.folder ne peut pas \u00EAtre affich\u00E9 car vous ne vous \u00EAtes pas inscrits pour le $\:projectbroker.themaSg  ou les responsable de sujet ne vous avez pas encore accept\u00E9 comme participant d\u00E9finitif.
 project.member.groupdescription=Groupe du $\:projectbroker.themaSg {0}, cr\u00E9\u00E9 automatiquement.
 project.member.groupname=$\:projectbroker.themaSg {0}
-projectbroker.condition.title=Acc\u00E8s g\u00E9n\u00E9ral \u00E0 l'affectation des sujets
 projectgroup.candidates.message=Apr\u00E8s avoir accept\u00E9 les candidats d\u00E9sir\u00E9s, \u00E9liminez de la liste les candidats non accept\u00E9s, svp.
 projectgroup.candidates.title=Candidats
 projectgroup.member.title=Participants accept\u00E9s
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_it.properties
index 78a48d3c1f8..330030cfaac 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_it.properties
+++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_it.properties
@@ -127,9 +127,7 @@ mail.remove.candidate.subject=Candidatura per il tema $projectTitle non accettat
 mail.remove.participant.body=*** Questo \u00E8 un messaggio generato automaticamente. Non risponda a questo messaggio, p.f. ***\r\n\r\nIl/i responsabile/i del tema $firstnameProjectManager $lastnameProjectManager (nome d'utente OLAT "$usernameProjectManager") l'ha didiscritta/o come partecipante dal tema "$projectTitle" il $currentDate.
 mail.remove.participant.subject=Disiscrizione come partecipante dal tema $projectTitle
 new.project.title=Novit\u00E0 $\:projectbroker.themaSg
-no.condition.available=Non ci sono elementi parziali configurati, quindi l'accesso non pu\u00F2 venire configurato.
 no.folder.available=Nessuna cartella di consegna o di restituzione disponibile.
-pane.tab.accessibility=Accesso
 pane.tab.accountmanagement=Responsabili
 pane.tab.conf.dropbox=Consegna
 pane.tab.conf.modules=Elementi parziali
@@ -148,7 +146,6 @@ project.folder.not.participant=Le $\:tab.project.folder non possono essere visua
 project.member.groupdescription=Gruppo di $\:projectbroker.themaSg {0} creato automaticamente.
 project.member.groupname=$\:projectbroker.themaSg {0}
 projectbroker-optionsCustomfields.title=$\:projectbroker.themenboerse\: aggiungere dei campi addizionali
-projectbroker.condition.title=Accesso generale all'assegnazione dei temi
 projectbroker.themaPl=temi
 projectbroker.themaSg=Tema
 projectbroker.themenboerse=Assegnazione dei temi
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_nl_NL.properties
index c8dcc18fed5..27f80499899 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_nl_NL.properties
+++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_nl_NL.properties
@@ -181,9 +181,7 @@ mail.remove.candidate.subject=Registratie voor onderwerp $projectTitle niet geac
 mail.remove.participant.body=*** Dit is een automatisch bericht. Gelieve niet te antwoorden ***\r\n\r\nDe onderwerpsauteur $firstnameProjectManager $lastnameProjectManager (OLAT gebruikersnaam "$usernameProjectManager") heeft u uitgeschreven als cursist van het onderwerp "$projectTitle" op $currentDate
 mail.remove.participant.subject=Uitschrijven van cursisten van het onderwerp $projectTitle
 new.project.title=Nieuw $\:projectbroker.themaSg
-no.condition.available=Geen deelelementen geconfigureerg. Hierdoor kunt u geen enkele toegang configureren.
 no.folder.available=Er staan geen drop of return boxes ter uw beschikking.
-pane.tab.accessibility=Toegang
 pane.tab.accountmanagement=Verantwoordelijke personen
 pane.tab.conf.dropbox=Vervaldatum
 pane.tab.conf.modules=Deelelementen
@@ -201,7 +199,6 @@ project.deleted.msg=$\:projectbroker.themaSg `{0}` gewist
 project.folder.not.participant=Deze $\:tab.project.folder kan niet getoond worden omdat u niet geregistreerd bent voor deze $\:projectbroker.themaSg of omdat de onderwerpsauteur u nog niet geaccepteerd heeft als cursist.
 project.member.groupdescription=Groep betreffende de $\:projectbroker.themaSg {0} is automatisch aangemaakt.
 project.member.groupname=$\:projectbroker.themaSg {0}
-projectbroker.condition.title=Algemene toegang tot onderwerpsopdrachten
 projectgroup.candidates.message=Gelieve de kandidaten die niet geaccepteerd konden worden uit de lijst te verwijderen nadat u de kandidaten geselecteerd hebt.
 projectgroup.candidates.title=Kandidaten
 projectgroup.member.title=Geaccepteerde cursisten
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pl.properties
index 4b6ba390b1d..67c353ac00d 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pl.properties
+++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pl.properties
@@ -122,9 +122,7 @@ mail.remove.candidate.subject=Rejestracja do $\:projectbroker.themaSg $projectTi
 mail.remove.participant.body=*** Ta wiadomo\u015B\u0107 zosta\u0142a wygenerowana automatycznie. Nie odpowiadaj na ni\u0105. ***\r\n\r\nAutor w\u0105tku ($firstnameProjectManager $lastnameProjectManager, nazwa u\u017Cytkownika \= $usernameProjectManager) wypisa\u0142 ci\u0119 z listy uczestnik\u00F3w w $\:projectbroker.themaSg $projectTitle dnia $currentDate.
 mail.remove.participant.subject=Wypisywanie uczestnik\u00F3w z $\:projectbroker.themaSg\: $projectTitle
 new.project.title=Nowy $\:projectbroker.themaSg
-no.condition.available=Nie skonfigurowano element\u00F3w sk\u0142adowych, dlatego nie mo\u017Cesz ustawi\u0107 dost\u0119pu.
 no.folder.available=Brak folder\u00F3w danych wej\u015Bciowych i folder\u00F3w zwrotnych, przeznaczonych do twojej dyspozycji
-pane.tab.accessibility=Dost\u0119p
 pane.tab.accountmanagement=Osoby odpowiedzialne
 pane.tab.conf.dropbox=Termin
 pane.tab.conf.modules=Elementy sk\u0142adowe
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pt_BR.properties
index 3a5182142b1..130dd4c7cc3 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_pt_BR.properties
@@ -127,9 +127,7 @@ mail.remove.candidate.subject=Participantes
 mail.remove.participant.body=Status do t\u00F3pico
 mail.remove.participant.subject=Vagas
 new.project.title=$\:projectbroker.themaSg
-no.condition.available=Nenhum autor de t\u00F3picos dispon\u00EDveis.
 no.folder.available=Administrar autores de t\u00F3pico
-pane.tab.accessibility=Um t\u00F3pico com este t\u00EDtulo j\u00E1 existe.
 pane.tab.accountmanagement=Este t\u00EDtulo \u00E9 obrigat\u00F3rio
 pane.tab.conf.dropbox=Drop box
 pane.tab.conf.modules=Caixa de retorno
@@ -148,7 +146,6 @@ project.folder.not.participant=Voc\u00EA quer apagar o grupo correspondente ao \
 project.member.groupdescription=Excluir $\:projectbroker.themaSg
 project.member.groupname=Anexo
 projectbroker-optionsCustomfields.title=$\:form.options.customfield.legend
-projectbroker.condition.title=Atribui\u00E7\u00F5es gerais de acesso ao t\u00F3pico
 projectbroker.themaPl=T\u00F3picos
 projectbroker.themaSg=T\u00F3pico
 projectbroker.themenboerse=Atribuir T\u00F3pico
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_zh_CN.properties
index d683a32bf75..ef0114839d1 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_zh_CN.properties
+++ b/src/main/java/org/olat/course/nodes/projectbroker/_i18n/LocalStrings_zh_CN.properties
@@ -176,9 +176,7 @@ mail.remove.candidate.subject=\u672A\u63A5\u53D7$\:projectbroker.themaSg $projec
 mail.remove.participant.body=***   \u8FD9\u662F\u7531\u7CFB\u7EDF\u81EA\u52A8\u53D1\u9001\u7684\u6D88\u606F\uFF0C\u8BF7\u4E0D\u8981\u56DE\u590D   ***\r\n\r\n\u4E3B\u9898\u7684\u4F5C\u8005($firstnameProjectManager $lastnameProjectManager, user name \= $usernameProjectManager)\u4E8E$currentDate\u5DF2\u7ECF\u5C06\u60A8\u8FD9\u4E2A\u53C2\u4E0E\u8005\u4ECE$\:projectbroker.themaSg $projectTitle \u6E05\u9000\u3002\r\n\r\nmatthew wu
 mail.remove.participant.subject=\u4ECE$\:projectbroker.themaSg \: $projectTitle\u4E2D\u5C06\u53C2\u4E0E\u8005\u6E05\u9000
 new.project.title=\u65B0\u7684$\:projectbroker.themaSg
-no.condition.available=\u6CA1\u6709\u914D\u7F6E\u90E8\u4EF6\u5143\u7D20\u3002\u56E0\u6B64\u60A8\u4E0D\u80FD\u8FDB\u884C\u4EFB\u4F55\u8BBF\u95EE\u3002
 no.folder.available=\u6CA1\u6709\u4EFB\u610F\u7684\u4E0B\u62C9\u6846\u6216\u8FD4\u56DE\u6846
-pane.tab.accessibility=\u8BBF\u95EE
 pane.tab.accountmanagement=\u8D1F\u8D23\u4EBA
 pane.tab.conf.dropbox=\u7ED3\u675F\u65E5\u671F
 pane.tab.conf.modules=\u90E8\u4EF6\u5143\u7D20
@@ -196,7 +194,6 @@ project.deleted.msg=\u5DF2\u5220\u9664$\:projectbroker.themaSg `{0}`
 project.folder.not.participant=\u56E0\u4E3A\u60A8\u6CA1\u6709\u6CE8\u518C $\:projectbroker.themaSg \u6216\u8005\u6B21\u4E3B\u9898\u7684\u4F5C\u8005\u8FD8\u6CA1\u6709\u5C06\u60A8\u4F5C\u4E3A\u53C2\u4E0E\u8005\u63A5\u53D7\uFF0C\u6240\u4EE5$\:tab.project.folder \u8FD8\u4E0D\u80FD\u4E3A\u60A8\u663E\u793A\u3002
 project.member.groupdescription=\u5DF2\u81EA\u52A8\u521B\u5EFA\u5173\u4E8E$\:projectbroker.themaSg {0}\u7684\u7FA4\u7EC4\u3002
 project.member.groupname=$\:projectbroker.themaSg {0}
-projectbroker.condition.title=\u4E00\u822C\u5E02\u573A\u51C6\u5165\u95EE\u9898
 projectgroup.candidates.title=\u5019\u9009\u4EBA
 projectgroup.member.title=\u5DF2\u63A5\u53D7\u7684\u53C2\u4E0E\u8005
 projectgroup.projectleader.title=\u4E3B\u9898\u7684\u4F5C\u8005
-- 
GitLab