diff --git a/src/main/java/org/olat/core/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/core/_i18n/LocalStrings_fr.properties
index 4d9c06f8bc7af9b92c45f04d7b6aa246245d933b..b2c5461f246b591bf78c8718767ddeccbdd8441c 100644
--- a/src/main/java/org/olat/core/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/core/_i18n/LocalStrings_fr.properties
@@ -66,8 +66,8 @@ rating.5.5=Excellent
 rating.explanation=Cliquez pour l'\u00E9valuation
 reset=Mettre \u00E0 z\u00E9ro
 save=Enregistrer
-save.close=Sauver et fermer
-savesas=Sauvegarder sous
+save.close=Enregistrer et fermer
+savesas=Enregistrer sous
 search=Chercher
 select=S\u00E9lectionner
 server.no.response=L'action n'a pas pu \u00EAtre effectu\u00E9e car le serveur n'a pas r\u00E9pondu ou est surcharg\u00E9. Essayez une nouvelle fois ou recharger la page.
diff --git a/src/main/java/org/olat/course/assessment/AssessmentMainController.java b/src/main/java/org/olat/course/assessment/AssessmentMainController.java
index 3dec256812b1868834085acc6e0201ec1851a4ce..c749cc74653ec5203c9c1363949d6df84b6cc551 100644
--- a/src/main/java/org/olat/course/assessment/AssessmentMainController.java
+++ b/src/main/java/org/olat/course/assessment/AssessmentMainController.java
@@ -674,16 +674,23 @@ public class AssessmentMainController extends MainLayoutBasicController implemen
 	 * @return List of identities
 	 */
 	private List<Identity> getAllAssessableIdentities() {
-
+		Set<Identity> duplicateKiller = new HashSet<>();
+		List<Identity> assessableIdentities = new ArrayList<>();
+		
 		List<Identity> participants = businessGroupService.getMembers(coachedGroups, GroupRoles.participant.name());
-		Set<Identity> duplicateKiller = new HashSet<>(participants);
+		for(Identity participant:participants) {
+			if(!duplicateKiller.contains(participant)) {
+				assessableIdentities.add(participant);
+				duplicateKiller.add(participant);
+			}
+		}
 		
 		if((repoTutor && coachedGroups.isEmpty()) || (callback.mayAssessAllUsers() || callback.mayViewAllUsersAssessments())) {
 			List<Identity> courseParticipants = repositoryService.getMembers(re, GroupRoles.participant.name());
-			for(Identity courseParticipant:courseParticipants) {
-				if(!duplicateKiller.contains(courseParticipant)) {
-					participants.add(courseParticipant);
-					duplicateKiller.add(courseParticipant);
+			for(Identity participant:courseParticipants) {
+				if(!duplicateKiller.contains(participant)) {
+					assessableIdentities.add(participant);
+					duplicateKiller.add(participant);
 				}
 			}
 		}
@@ -692,14 +699,16 @@ public class AssessmentMainController extends MainLayoutBasicController implemen
 			mayViewAllUsersAssessments = true;
 			ICourse course = CourseFactory.loadCourse(ores);
 			CoursePropertyManager pm = course.getCourseEnvironment().getCoursePropertyManager();
-			List<Identity> assessedRsers = pm.getAllIdentitiesWithCourseAssessmentData(participants);
-			for(Identity assessedRser:assessedRsers) {
-				if(!duplicateKiller.contains(assessedRser)) {
-					participants.add(assessedRser);
+			List<Identity> assessedUsers = pm.getAllIdentitiesWithCourseAssessmentData(participants);
+			for(Identity assessedUser:assessedUsers) {
+				if(!duplicateKiller.contains(assessedUser)) {
+					assessableIdentities.add(assessedUser);
+					duplicateKiller.add(assessedUser);
 				}
 			}
 		}
-		return participants;
+		
+		return assessableIdentities;
 	}
 	
 	private void fillAlternativeToAssessableIdentityList(AssessmentToolOptions options) {
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxPDFExport.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxPDFExport.java
index c8fa646cfc9d4a48e48abf78153a542da09e8b1a..11b06b008bbba6dd13626fc87c1be418dfeaaa0d 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxPDFExport.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxPDFExport.java
@@ -257,7 +257,8 @@ public class CheckboxPDFExport extends PdfDocument implements MediaResource {
     	return headers;
 	}
     
-	public int drawTable(String[] headers, String[][] content, int offset, float maxHeaderSize, float nameMaxSize, float fontSize, float cellMargin)
+	public int drawTable(String[] headers, String[][] content, int offset,
+			float maxHeaderSize, float nameMaxSize, float fontSize, float cellMargin)
 	throws IOException {
 	
 		float tableWidth = width;
@@ -324,6 +325,7 @@ public class CheckboxPDFExport extends PdfDocument implements MediaResource {
 
 		currentY -= headerHeight;
 
+		//draw the content
 		textx = marginLeftRight + cellMargin;
 		texty = currentY - 15;
 		for (int i=offset; i<end; i++) {
@@ -339,7 +341,7 @@ public class CheckboxPDFExport extends PdfDocument implements MediaResource {
 					currentContentStream.drawString(text);
 					currentContentStream.endText();
 				}
-				textx += (j==0 ? 100 : colWidth);
+				textx += (j==0 ? nameMaxSize : colWidth);
 			}
 			texty -= rowHeight;
 			textx = marginLeftRight + cellMargin;
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsDisplayController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsDisplayController.java
index 63510ff6972436915af5bb6fa99ff8f8e81314fd..03818027f086081cae5d1a620d6025a67e672d1e 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsDisplayController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsDisplayController.java
@@ -34,7 +34,6 @@ import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory;
 import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.download.DisplayOrDownloadComponent;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
 import org.olat.core.gui.components.velocity.VelocityContainer;
@@ -45,13 +44,16 @@ import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.gui.control.creator.ControllerCreator;
 import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
+import org.olat.core.gui.media.MediaResource;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.UserConstants;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.LockResult;
 import org.olat.core.util.resource.OresHelper;
-import org.olat.core.util.vfs.VFSContainerMapper;
+import org.olat.core.util.vfs.VFSItem;
+import org.olat.core.util.vfs.VFSLeaf;
+import org.olat.core.util.vfs.VFSMediaResource;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.projectbroker.datamodel.CustomField;
 import org.olat.course.nodes.projectbroker.datamodel.Project;
@@ -184,7 +186,8 @@ public class ProjectDetailsDisplayController extends BasicController {
 			myContent.contextPut("projectPlaces", placesValue);
 		}
 		
-		attachedFileLink = LinkFactory.createCustomLink("attachedFileLink", "cmd.donwload.attachment", project.getAttachmentFileName(), Link.NONTRANSLATED, myContent, this);
+		attachedFileLink = LinkFactory.createCustomLink("attachedFileLink", "cmd.download.attachment", project.getAttachmentFileName(), Link.NONTRANSLATED, myContent, this);
+		attachedFileLink.setTarget("_blank");
 		putInitialPanel(myContent);
 	}
 
@@ -285,14 +288,12 @@ public class ProjectDetailsDisplayController extends BasicController {
 		// Mapper is cleaned up automatically by basic controller
 
 		OlatRootFolderImpl rootFolder = new OlatRootFolderImpl(projectBrokerManager.getAttamchmentRelativeRootPath(project,courseEnv,cNode),null);
-		String baseUrl = registerMapper(ureq, new VFSContainerMapper(rootFolder));
-
-		// Trigger auto-download
-		if(isLogDebugEnabled()) {
-			logDebug("baseUrl=" + baseUrl, null);
+		VFSItem item = rootFolder.resolve(project.getAttachmentFileName());
+		if(item instanceof VFSLeaf) {
+			VFSLeaf attachment = (VFSLeaf)item;
+			MediaResource resource = new VFSMediaResource(attachment);
+			ureq.getDispatchResult().setResultingMediaResource(resource);
 		}
-		DisplayOrDownloadComponent dordc = new DisplayOrDownloadComponent("downloadcomp",baseUrl + "/" + project.getAttachmentFileName());
-		myContent.put("autoDownloadComp", dordc);
 	}
 	
 }
diff --git a/src/main/java/org/olat/course/run/navigation/NavigationHandler.java b/src/main/java/org/olat/course/run/navigation/NavigationHandler.java
index 4dece99bce1ed1bc83893052f10f3e1dca8b0eff..f3612a7d0010939f34f75ef4cbaef0cecd4822c5 100644
--- a/src/main/java/org/olat/course/run/navigation/NavigationHandler.java
+++ b/src/main/java/org/olat/course/run/navigation/NavigationHandler.java
@@ -36,6 +36,7 @@ import java.util.Set;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.tree.GenericTreeModel;
 import org.olat.core.gui.components.tree.GenericTreeNode;
+import org.olat.core.gui.components.tree.MenuTree;
 import org.olat.core.gui.components.tree.TreeEvent;
 import org.olat.core.gui.components.tree.TreeModel;
 import org.olat.core.gui.components.tree.TreeNode;
@@ -210,12 +211,17 @@ public class NavigationHandler implements Disposable {
 
 			boolean dispatch = true;
 			if(userObject instanceof String) {
-				if(TreeEvent.COMMAND_TREENODE_OPEN.equals(treeEvent.getSubCommand())) {
+				if(MenuTree.COMMAND_TREENODE_CLICKED.equals(treeEvent.getCommand()) && treeEvent.getSubCommand() == null) {
+					openCourseNodeIds.add((String)userObject);
+					openTreeNodeIds.add((String)userObject);
+				} else if(TreeEvent.COMMAND_TREENODE_OPEN.equals(treeEvent.getSubCommand())) {
 					openCourseNodeIds.add((String)userObject);
 					openTreeNodeIds.add((String)userObject);
 					dispatch = false;
 				} else if(TreeEvent.COMMAND_TREENODE_CLOSE.equals(treeEvent.getSubCommand())) {
 					removeChildrenFromOpenNodes(selTN);
+					openCourseNodeIds.remove((String)userObject);
+					openTreeNodeIds.remove((String)userObject);
 					dispatch = false;
 				}
 			}
@@ -442,6 +448,12 @@ public class NavigationHandler implements Disposable {
 					//add the selected node to the open one, if not, strange behaviour
 					selectedCourseNodeId = courseNode.getIdent();
 					openCourseNodeIds.add(selectedCourseNodeId);
+					if(ncr != null) {
+						String subNodeId = ncr.getSelectedTreeNodeId();
+						if(subNodeId != null) {
+							openCourseNodeIds.add(subNodeId);
+						}
+					}
 				}
 				
 				openTreeNodeIds = convertToTreeNodeIds(treeEval, openCourseNodeIds);