diff --git a/src/main/java/org/olat/core/gui/components/htmlheader/jscss/CustomCSS.java b/src/main/java/org/olat/core/gui/components/htmlheader/jscss/CustomCSS.java
index 5c68e31af728ea5580319b2da85df21dfcb5da78..e83061ed68c155cc4c10badab3704e5255c41015 100644
--- a/src/main/java/org/olat/core/gui/components/htmlheader/jscss/CustomCSS.java
+++ b/src/main/java/org/olat/core/gui/components/htmlheader/jscss/CustomCSS.java
@@ -47,11 +47,11 @@ import org.olat.core.util.vfs.VFSManager;
  */
 public class CustomCSS extends LogDelegator implements Disposable {
 
-	private String relCssFilename;
-	private String relCssFileIframe;
-	private Mapper cssUriMapper;
-	private MapperKey cssUriMapperKey;
-	private JSAndCSSComponent jsAndCssComp;
+	private final String relCssFilename;
+	private final String relCssFileIframe;
+	private final Mapper cssUriMapper;
+	private final MapperKey cssUriMapperKey;
+	private final JSAndCSSComponent jsAndCssComp;
 	private Object DISPOSE_LOCK = new Object();
 
 	/**
@@ -67,9 +67,10 @@ public class CustomCSS extends LogDelegator implements Disposable {
 	 */
 	public CustomCSS(final VFSContainer cssBaseContainer,
 			final String relCssFilename, UserSession uSess) {
-		createCSSUriMapper(cssBaseContainer);
+		cssUriMapper = createCSSUriMapper(cssBaseContainer);
 		this.relCssFilename = relCssFilename;
-		registerMapper(cssBaseContainer, uSess);
+		this.relCssFileIframe = null;
+		cssUriMapperKey = registerMapper(cssBaseContainer, uSess);
 		// initialize js and css component
 		jsAndCssComp = new JSAndCSSComponent("jsAndCssComp", this.getClass(), false);
 		String fulluri = cssUriMapperKey.getUrl() + relCssFilename;
@@ -79,10 +80,10 @@ public class CustomCSS extends LogDelegator implements Disposable {
 	
 	public CustomCSS(final VFSContainer cssBaseContainer,
 			final String relCssFileMain, final String relCssFileIFrame, UserSession uSess ) {
-		createCSSUriMapper(cssBaseContainer);
+		cssUriMapper = createCSSUriMapper(cssBaseContainer);
 		this.relCssFilename = relCssFileMain;
 		this.relCssFileIframe = relCssFileIFrame;
-		registerMapper(cssBaseContainer, uSess);
+		cssUriMapperKey = registerMapper(cssBaseContainer, uSess);
 		
 		// initialize js and css component
 		jsAndCssComp = new JSAndCSSComponent("jsAndCssComp", this.getClass(), false);
@@ -96,25 +97,27 @@ public class CustomCSS extends LogDelegator implements Disposable {
 	 * @param cssBaseContainer
 	 * @param uSess
 	 */
-	private void registerMapper(final VFSContainer cssBaseContainer, UserSession uSess) {
+	private MapperKey registerMapper(final VFSContainer cssBaseContainer, UserSession uSess) {
 		// Register mapper as cacheable
 		String mapperID = VFSManager.getRealPath(cssBaseContainer);
+		MapperKey mapperKey;
 		if (mapperID == null) {
 			// Can't cache mapper, no cacheable context available
-			cssUriMapperKey  = CoreSpringFactory.getImpl(MapperService.class).register(uSess, cssUriMapper);
+			mapperKey = CoreSpringFactory.getImpl(MapperService.class).register(uSess, cssUriMapper);
 		} else {
 			// Add classname to the file path to remove conflicts with other
 			// usages of the same file path
 			mapperID = this.getClass().getSimpleName() + ":" + mapperID + System.currentTimeMillis();
-			cssUriMapperKey  = CoreSpringFactory.getImpl(MapperService.class).register(uSess, mapperID, cssUriMapper);
+			mapperKey = CoreSpringFactory.getImpl(MapperService.class).register(uSess, mapperID, cssUriMapper);
 		}
+		return mapperKey;
 	}
 
 	/**
 	 * @param cssBaseContainer
 	 */
-	private void createCSSUriMapper(final VFSContainer cssBaseContainer) {
-		cssUriMapper = new VFSContainerMapper(cssBaseContainer);
+	private Mapper createCSSUriMapper(final VFSContainer cssBaseContainer) {
+		return new VFSContainerMapper(cssBaseContainer);
 	}
 
 	/**
@@ -149,13 +152,11 @@ public class CustomCSS extends LogDelegator implements Disposable {
 	/**
 	 * @see org.olat.core.gui.control.Disposable#dispose()
 	 */
+	@Override
 	public void dispose() {
 		synchronized (DISPOSE_LOCK) {
-			if (cssUriMapper != null) {
-				CoreSpringFactory.getImpl(MapperService.class).cleanUp(Collections.singletonList(cssUriMapperKey));
-				cssUriMapper = null;
-				cssUriMapperKey = null;
-				jsAndCssComp = null;				
+			if (cssUriMapperKey != null) {
+				CoreSpringFactory.getImpl(MapperService.class).cleanUp(Collections.singletonList(cssUriMapperKey));				
 			}
 		}
 	}
diff --git a/src/main/java/org/olat/course/assessment/manager/BulkAssessmentTask.java b/src/main/java/org/olat/course/assessment/manager/BulkAssessmentTask.java
index 8279b5a9194bf2f61880a49e0456b2d189b666d8..a8c37aa922eb1c0f56b64666c753b4e2a1be7da7 100644
--- a/src/main/java/org/olat/course/assessment/manager/BulkAssessmentTask.java
+++ b/src/main/java/org/olat/course/assessment/manager/BulkAssessmentTask.java
@@ -437,14 +437,14 @@ public class BulkAssessmentTask implements LongRunnable, TaskAwareRunnable, Sequ
 		Identity identity = uce.getIdentityEnvironment().getIdentity();
 		RepositoryEntry entry = uce.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 		
-		org.olat.course.nodes.gta.Task task;
+		org.olat.course.nodes.gta.Task gtaTask;
 		TaskList taskList = gtaManager.getTaskList(entry, courseNode);
 		if(taskList == null) {
 			taskList = gtaManager.createIfNotExists(entry, courseNode);
-			task = gtaManager.createTask(null, taskList, status, null, identity, courseNode);
+			gtaTask = gtaManager.createTask(null, taskList, status, null, identity, courseNode);
 		} else {
-			task = gtaManager.getTask(identity, taskList);
-			if(task == null) {
+			gtaTask = gtaManager.getTask(identity, taskList);
+			if(gtaTask == null) {
 				gtaManager.createTask(null, taskList, status, null, identity, courseNode);
 			}
 		}
diff --git a/src/main/java/org/olat/course/editor/ChooseNodeController.java b/src/main/java/org/olat/course/editor/ChooseNodeController.java
index ea14c2049473c74834a8373fb339da5baab3db90..5b4bb0c8c19d8e085fc7cf7db0b197a81eddb58e 100644
--- a/src/main/java/org/olat/course/editor/ChooseNodeController.java
+++ b/src/main/java/org/olat/course/editor/ChooseNodeController.java
@@ -74,6 +74,10 @@ public class ChooseNodeController extends BasicController {
 		CourseNodeFactory cnf = CourseNodeFactory.getInstance();
 		for (String courseNodeAlias : cnf.getRegisteredCourseNodeAliases()) {
 			CourseNodeConfiguration cnConfig = cnf.getCourseNodeConfiguration(courseNodeAlias);
+			if(cnConfig.isDeprecated()) {
+				continue;
+			}
+			
 			try {
 				String group = cnConfig.getGroup();
 				CourseNodeTypesGroup typesGroup = linkNames.get(group);
diff --git a/src/main/java/org/olat/course/editor/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/editor/_i18n/LocalStrings_de.properties
index aaf5bb3cac635d88192a910f1c655afc66c4f332..63ff5a2891af59473cb6040c3188c4be6d3bc57b 100644
--- a/src/main/java/org/olat/course/editor/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/editor/_i18n/LocalStrings_de.properties
@@ -1,9 +1,9 @@
 #Thu Aug 21 16:55:08 CEST 2014
 access.form.label=Zugriff auf den gesamten Kurs haben
 access.legend=Zugriff auf den gesamten Kurs \u00E4ndern
-alternative=Alternativer Kursbaustein suchen
+alternative=Alternativen Kursbaustein suchen
 alternative.bbs=Alternative Bausteine
-alternative.choose=Alternativer Kursbaustein w\u00E4hlen und konvertieren
+alternative.choose=Alternativen Kursbaustein w\u00E4hlen und konvertieren
 alternative.choose.description=W\u00E4hlen Sie aus der Liste der m\u00F6glichen alternativen Kursbausteine mit \u00E4hnlicher Funktionalit\u00E4t aus um diesen deaktivirten Kursbaustein zu konvertieren. Es werden der Titel und die Beschreibung sowie die Zugangsregeln und alle Kinderelemente \u00FCbernommen. 
 apply=OK
 assessment=Wissens\u00FCberpr\u00FCfung
@@ -349,7 +349,7 @@ condition.noAccessExplanation.title=Information wenn sichtbar und kein Zugang
 condition.visibility.title=Sichtbarkeit
 content=Wissensvermittlung
 copy.course.element.title=Kursbaustein kopieren
-course.building.block.deprecated=Dieser Kursbausteintyp wurde deprecated.
+course.building.block.deprecated=Dieser Kursbausteintyp ist veraltet.
 course.building.block.disabled=Dieser Kursbausteintyp wurde deaktiviert. Kontaktieren Sie den Administrator, l\u00F6schen Sie den Baustein aus Ihrem Kurs oder w\u00E4hlen Sie die Schaltfl\u00E4che "$\:alternative" um einen alternativen Baustein mit \u00E4hnlicher Funktion zu suchen und den Baustein zu konvertieren. 
 course.building.block.disabled.user=Dieser Kursbausteintyp wurde deaktiviert. Kontaktieren Sie den Administrator oder die Kursleitung.
 coursefolder.close=Ablageordner schliessen
diff --git a/src/main/java/org/olat/course/editor/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/editor/_i18n/LocalStrings_en.properties
index 4ea4e7a02376b24b20f2557e8031e938a45be59d..6ce9a32ef4e58da4769db7cd068f16dde6c6f108 100644
--- a/src/main/java/org/olat/course/editor/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/editor/_i18n/LocalStrings_en.properties
@@ -1,7 +1,7 @@
 #Wed Dec 17 17:29:34 CET 2014
 access.form.label=Access to entire course have
 access.legend=Modify access to entire course
-alternative=Search for alternative course element
+alternative=Search for an alternative course element
 alternative.bbs=Alternative course elements
 alternative.choose=Select an alternative course element and convert
 alternative.choose.description=Select from the list of alternative course elements that offer similar functionality to convert this deactivated course element. The title, description, access rules and all child element will be copied to the converted element.
@@ -349,6 +349,7 @@ condition.noAccessExplanation.title=Information if visible and no access
 condition.visibility.title=Visibility
 content=Knowledge transfer
 copy.course.element.title=Copy course element
+course.building.block.deprecated=This course element is deprecated.
 course.building.block.disabled=This course element type has been deactivated. Please contact the system administrator or delete the course element from the course.
 course.building.block.disabled.user=This course element type has been deactivated. Please contact the system or course administrator.
 coursefolder.close=Close storage folder 
diff --git a/src/main/java/org/olat/course/nodes/GTACourseNode.java b/src/main/java/org/olat/course/nodes/GTACourseNode.java
index ecd475adf1c86915fa7cade2d7b194c9047a8eab..834822ffca7300b8cf578cf083d1f71617555df6 100644
--- a/src/main/java/org/olat/course/nodes/GTACourseNode.java
+++ b/src/main/java/org/olat/course/nodes/GTACourseNode.java
@@ -201,6 +201,7 @@ public class GTACourseNode extends AbstractAccessableCourseNode implements Asses
 			config.set(MSCourseNode.CONFIG_KEY_SCORE_MIN, new Float(0));
 			config.set(MSCourseNode.CONFIG_KEY_SCORE_MAX, new Float(0));
 			config.set(MSCourseNode.CONFIG_KEY_HAS_PASSED_FIELD, Boolean.TRUE);
+			config.set(MSCourseNode.CONFIG_KEY_HAS_COMMENT_FIELD, Boolean.TRUE);
 		}
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/_spring/buildingblockContext.xml b/src/main/java/org/olat/course/nodes/_spring/buildingblockContext.xml
index 3eee4b443b0c20ad9b53a1685f6af7a1b3093887..34290197de561b2f024a65fa967e938cb1c07bea 100644
--- a/src/main/java/org/olat/course/nodes/_spring/buildingblockContext.xml
+++ b/src/main/java/org/olat/course/nodes/_spring/buildingblockContext.xml
@@ -79,7 +79,7 @@
 		<property name="order" value="130" />
 		<property name="alternativeCourseNodes">
 			<list>
-				<value>igta</value>
+				<value>ita</value>
 			</list>
 		</property>
 	</bean>
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java
index ca1ffc1814fd2ed6e40eeb2baafd876f4eed14a7..080332395b8250321f73e574ac72fd534371e87b 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java
@@ -98,6 +98,11 @@ public class GTACoachController extends GTAAbstractController {
 	protected void initContainer(UserRequest ureq) {
 		mainVC = createVelocityContainer("coach");
 		
+		reviewedButton  = LinkFactory.createCustomLink("coach.reviewed.button", "reviewed", "coach.reviewed.button", Link.BUTTON, mainVC, this);
+		if(config.getBooleanSafe(GTACourseNode.GTASK_REVISION_PERIOD)) {
+			needRevisionsButton  = LinkFactory.createCustomLink("coach.need.revision.button", "need-revision", "coach.need.revision.button", Link.BUTTON, mainVC, this);
+		}
+		
 		if(withTitle) {
 			if(assessedGroup != null) {
 				mainVC.contextPut("groupName", assessedGroup.getName());
@@ -171,6 +176,11 @@ public class GTACoachController extends GTAAbstractController {
 	protected Task stepReviewAndCorrection(UserRequest ureq, Task assignedTask) {
 		assignedTask = super.stepReviewAndCorrection(ureq, assignedTask);
 		
+		reviewedButton.setVisible(false);
+		if(needRevisionsButton != null) {
+			needRevisionsButton.setVisible(false);
+		}
+		
 		mainVC.contextPut("review", Boolean.FALSE);
 		if(config.getBooleanSafe(GTACourseNode.GTASK_ASSIGNMENT)
 				|| config.getBooleanSafe(GTACourseNode.GTASK_SUBMIT)) {
@@ -205,13 +215,13 @@ public class GTACoachController extends GTAAbstractController {
 			documentsContainer = gtaManager.getCorrectionContainer(courseEnv, gtaNode, assessedIdentity);
 		}
 		
-		submitCorrectionsCtrl = new SubmitDocumentsController(ureq, getWindowControl(), task, documentsDir, documentsContainer, -1, config);
+		submitCorrectionsCtrl = new SubmitDocumentsController(ureq, getWindowControl(), task, documentsDir, documentsContainer, -1, config, "coach.document");
 		listenTo(submitCorrectionsCtrl);
 		mainVC.put("corrections", submitCorrectionsCtrl.getInitialComponent());
 		
-		reviewedButton  = LinkFactory.createCustomLink("coach.reviewed.button", "reviewed", "coach.reviewed.button", Link.BUTTON, mainVC, this);
+		reviewedButton.setVisible(true);
 		if(config.getBooleanSafe(GTACourseNode.GTASK_REVISION_PERIOD)) {
-			needRevisionsButton  = LinkFactory.createCustomLink("coach.need.revision.button", "need-revision", "coach.need.revision.button", Link.BUTTON, mainVC, this);
+			needRevisionsButton.setVisible(true);
 		}
 	}
 	
@@ -343,11 +353,15 @@ public class GTACoachController extends GTAAbstractController {
 	@Override
 	protected void event(UserRequest ureq, Component source, Event event) {
 		if(reviewedButton == source) {
-			Task assignedTask = submitCorrectionsCtrl.getAssignedTask();
-			doReviewedDocument(ureq, assignedTask);
+			if(submitCorrectionsCtrl != null) {
+				Task assignedTask = submitCorrectionsCtrl.getAssignedTask();
+				doReviewedDocument(ureq, assignedTask);
+			}
 		} else if(needRevisionsButton == source) {
-			Task assignedTask = submitCorrectionsCtrl.getAssignedTask();
-			doRevisions(ureq, assignedTask);
+			if(submitCorrectionsCtrl != null) {
+				Task assignedTask = submitCorrectionsCtrl.getAssignedTask();
+				doRevisions(ureq, assignedTask);
+			}
 		}
 		super.event(ureq, source, event);
 	}
@@ -411,7 +425,9 @@ public class GTACoachController extends GTAAbstractController {
 	}
 	
 	private void doReviewedDocument(UserRequest ureq, Task task) {
-		gtaManager.updateTask(task, TaskProcess.solution);
+		//go to solution, grading or graded
+		TaskProcess nextStep = gtaManager.nextStep(TaskProcess.correction, gtaNode);
+		gtaManager.updateTask(task, nextStep);
 		showInfo("coach.documents.successfully.reviewed");
 		gtaManager.log("Review", "documents reviewed", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
 		
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java
index 4010da05ffe59be9f7ece0c22f189b33679747ae..78893b5b612b9d2a9d75694441c1569cd116956e 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachRevisionAndCorrectionsController.java
@@ -177,7 +177,7 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController {
 			documentsContainer = gtaManager.getRevisedDocumentsCorrectionsContainer(courseEnv, gtaNode, iteration, assessedIdentity);
 		}
 		
-		uploadCorrectionsCtrl = new SubmitDocumentsController(ureq, getWindowControl(), task, documentsDir, documentsContainer, -1, config);
+		uploadCorrectionsCtrl = new SubmitDocumentsController(ureq, getWindowControl(), task, documentsDir, documentsContainer, -1, config, "coach.document");
 		listenTo(uploadCorrectionsCtrl);
 		mainVC.put("uploadCorrections", uploadCorrectionsCtrl.getInitialComponent());
 
@@ -218,7 +218,8 @@ public class GTACoachRevisionAndCorrectionsController extends BasicController {
 	}
 	
 	private void doCloseRevisionProcess() {
-		assignedTask = gtaManager.updateTask(assignedTask, TaskProcess.solution);
+		TaskProcess nextStep = gtaManager.nextStep(TaskProcess.correction, gtaNode);
+		assignedTask = gtaManager.updateTask(assignedTask, nextStep);
 		gtaManager.log("Revision", "close revision", assignedTask, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
 	}
 }
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java
index 90d92fcf1cbfc46e906b14ce8d11d014ff7e0a4c..c796a900a88ada0a1bb4226f6ab18f33406c0988 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantController.java
@@ -143,6 +143,10 @@ public class GTAParticipantController extends GTAAbstractController {
 		
 		if(TaskHelper.inOrNull(assignedTask, TaskProcess.assignment)) {
 			mainVC.contextPut("assignmentCssClass", "o_active");
+			if(stepPreferences != null) {
+				//assignment is very important, open it always
+				stepPreferences.setAssignement(Boolean.TRUE);
+			}
 			
 			//assignment open?
 			Date dueDate = getAssignementDueDate();
@@ -244,7 +248,7 @@ public class GTAParticipantController extends GTAAbstractController {
 		}
 		
 		int maxDocs = config.getIntegerSafe(GTACourseNode.GTASK_MAX_SUBMITTED_DOCS, -1);
-		submitDocCtrl = new SubmitDocumentsController(ureq, getWindowControl(), task, documentsDir, documentsContainer, maxDocs, config);
+		submitDocCtrl = new SubmitDocumentsController(ureq, getWindowControl(), task, documentsDir, documentsContainer, maxDocs, config, "document");
 		listenTo(submitDocCtrl);
 		mainVC.put("submitDocs", submitDocCtrl.getInitialComponent());
 		
@@ -279,7 +283,8 @@ public class GTAParticipantController extends GTAAbstractController {
 	}
 	
 	private void doSubmitDocuments(UserRequest ureq, Task task) {
-		task = gtaManager.updateTask(task, TaskProcess.review);
+		TaskProcess review = gtaManager.nextStep(TaskProcess.submit, gtaNode);
+		task = gtaManager.updateTask(task, review);
 		showInfo("run.documents.successfully.submitted");
 		
 		gtaManager.log("Submit", "submit documents", task, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
@@ -592,7 +597,6 @@ public class GTAParticipantController extends GTAAbstractController {
 			if(event instanceof SubmitEvent) {
 				Task assignedTask = submitDocCtrl.getAssignedTask();
 				gtaManager.log("Submit", (SubmitEvent)event, assignedTask, getIdentity(), assessedIdentity, assessedGroup, courseEnv, gtaNode);
-				doUpdateAttempts();
 			}
 		}
 		super.event(ureq, source, event);
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java
index 0b523023e3df91440b4c3358d1f18b585e787b53..9afa45141e86311bef42db748136d5f40129c3ee 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAParticipantRevisionAndCorrectionsController.java
@@ -152,7 +152,7 @@ public class GTAParticipantRevisionAndCorrectionsController extends BasicControl
 			documentsDir = gtaManager.getRevisedDocumentsDirectory(courseEnv, gtaNode, iteration, getIdentity());
 			documentsContainer = gtaManager.getRevisedDocumentsContainer(courseEnv, gtaNode, iteration, getIdentity());
 		}
-		uploadRevisionsCtrl = new SubmitDocumentsController(ureq, getWindowControl(), task, documentsDir, documentsContainer, -1, config);
+		uploadRevisionsCtrl = new SubmitDocumentsController(ureq, getWindowControl(), task, documentsDir, documentsContainer, -1, config, "document");
 		listenTo(uploadRevisionsCtrl);
 		mainVC.put("uploadRevisions", uploadRevisionsCtrl.getInitialComponent());
 		
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GroupAssessmentController.java b/src/main/java/org/olat/course/nodes/gta/ui/GroupAssessmentController.java
index 91412256b95bfe028117d18fbcfed53e0f84193c..29dacc83ff43dbaef0f630627e438c7382f0657f 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GroupAssessmentController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GroupAssessmentController.java
@@ -84,6 +84,7 @@ public class GroupAssessmentController extends FormBasicController {
 	private final boolean isAdministrativeUser;
 	private final List<UserPropertyHandler> userPropertyHandlers;
 
+	private Float cutValue;
 	private final boolean withScore, withPassed;
 	private final GTACourseNode gtaNode;
 	private final CourseEnvironment courseEnv;
@@ -112,6 +113,9 @@ public class GroupAssessmentController extends FormBasicController {
 
 		withScore = courseNode.hasScoreConfigured();
 		withPassed = courseNode.hasPassedConfigured();
+		if(withPassed) {
+			cutValue = courseNode.getCutValueConfiguration();
+		}
 		
 		Roles roles = ureq.getUserSession().getRoles();
 		isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles);
@@ -140,7 +144,7 @@ public class GroupAssessmentController extends FormBasicController {
 		applyToAllEl = uifactory.addCheckboxesHorizontal("applytoall", "group.apply.toall", groupGradingCont, onKeys, onValues);
 		applyToAllEl.addActionListener(FormEvent.ONCHANGE);
 		
-		if(withPassed) {
+		if(withPassed && cutValue == null) {
 			groupPassedEl = uifactory.addCheckboxesHorizontal("checkgroup", "group.passed", groupGradingCont, onKeys, onValues);
 		}
 		
@@ -175,7 +179,7 @@ public class GroupAssessmentController extends FormBasicController {
 			}
 		}
 		
-		if(withPassed) {
+		if(withPassed && cutValue == null) {
 			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.passedEl.i18nKey(), Cols.passedEl.ordinal()));
 		}
 
@@ -280,7 +284,7 @@ public class GroupAssessmentController extends FormBasicController {
 				}
 			}
 			
-			if(withPassed) {
+			if(withPassed && cutValue == null) {
 				Boolean passed = scoreEval.getPassed();
 				MultipleSelectionElement passedEl = uifactory.addCheckboxesHorizontal("check" + count, null, flc, onKeys, onValues);
 				if(passed != null && passed.booleanValue()) {
@@ -373,7 +377,11 @@ public class GroupAssessmentController extends FormBasicController {
 			
 			Boolean passed = null;
 			if(withPassed) {
-				passed = groupPassedEl.isSelected(0);
+				if(cutValue == null) {
+					passed = groupPassedEl.isSelected(0);
+				} else if(score != null) {
+					passed = (score.floatValue() >= cutValue.floatValue()) ? Boolean.TRUE	: Boolean.FALSE;
+				}
 			}
 
 			for(AssessmentRow row:rows) {
@@ -395,7 +403,11 @@ public class GroupAssessmentController extends FormBasicController {
 				
 				Boolean passed = null;
 				if(withPassed) {
-					passed = row.getPassedEl().isSelected(0);
+					if(cutValue == null) {
+						passed = row.getPassedEl().isSelected(0);
+					} else if(score != null) {
+						passed = (score.floatValue() >= cutValue.floatValue()) ? Boolean.TRUE	: Boolean.FALSE;
+					}
 				}
 				
 				ScoreEvaluation newScoreEval = new ScoreEvaluation(score, passed);
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
index 73b802b91dcecfeb1ad0a0e72576eead0aecaa37..a6ec3499aa2fa7167a41aea5e9d3a004e413a96d 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
@@ -83,18 +83,21 @@ class SubmitDocumentsController extends FormBasicController {
 	private HTMLEditorController newDocumentEditorCtrl, editDocumentEditorCtrl;
 	
 	private final int maxDocs;
+	private final String docI18nKey;
 	private final Task assignedTask;
 	private final File documentsDir;
 	private final VFSContainer documentsContainer;
 	private final ModuleConfiguration config;
 	
 	public SubmitDocumentsController(UserRequest ureq, WindowControl wControl, Task assignedTask,
-			File documentsDir, VFSContainer documentsContainer, int maxDocs, ModuleConfiguration config) {
+			File documentsDir, VFSContainer documentsContainer, int maxDocs, ModuleConfiguration config,
+			String docI18nKey) {
 		super(ureq, wControl, "documents");
 		this.assignedTask = assignedTask;
 		this.documentsDir = documentsDir;
 		this.documentsContainer = documentsContainer;
 		this.maxDocs = maxDocs;
+		this.docI18nKey = docI18nKey;
 		this.config = config;
 		initForm(ureq);
 		updateModel();
@@ -116,7 +119,7 @@ class SubmitDocumentsController extends FormBasicController {
 		}
 
 		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DocCols.document.i18nKey(), DocCols.document.ordinal()));
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(docI18nKey, DocCols.document.ordinal()));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(DocCols.date.i18nKey(), DocCols.date.ordinal()));
 		columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel("edit", DocCols.edit.ordinal(), "edit",
 				new BooleanCellRenderer(
@@ -150,6 +153,12 @@ class SubmitDocumentsController extends FormBasicController {
 			String msg = translate("error.max.documents", new String[]{ Integer.toString(maxDocs)});
 			flc.contextPut("maxDocsWarning", msg);
 		} else {
+			if(uploadDocButton != null) {
+				uploadDocButton.setEnabled(true);
+			}
+			if(createDocButton != null) {
+				createDocButton.setEnabled(true);
+			}
 			flc.contextPut("maxDocsWarning", Boolean.FALSE);
 		}
 	}
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html b/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html
index 2ac7eee5de15f955dd6f106130b5fe470a54ccaa..3c08086fb78756df88b95801160d0dba42fa08b1 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html
+++ b/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html
@@ -62,12 +62,12 @@ $r.render("contextualSubscription")
 		<div id="o_step_review_content" class="o_content collapse #if($collapse_reviewAndCorrection) in #end" aria-expanded="$collapse_reviewAndCorrection">
 		#if($r.available("corrections"))
 			$r.render("corrections")
-			#if($r.available("coach.reviewed.button") || $r.available("coach.need.revision.button"))
+			#if($r.visible("coach.reviewed.button") || $r.visible("coach.need.revision.button"))
 				<div class="o_button_group">
-				#if($r.available("coach.reviewed.button"))
+				#if($r.visible("coach.reviewed.button"))
 					$r.render("coach.reviewed.button")
 				#end
-				#if($r.available("coach.need.revision.button"))
+				#if($r.visible("coach.need.revision.button"))
 					$r.render("coach.need.revision.button")
 				#end
 				</div>
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_content/coach_group_grading.html b/src/main/java/org/olat/course/nodes/gta/ui/_content/coach_group_grading.html
index e2826b578d312f4738f824a419259896947d1f59..bb6289d76d75c1a9b3114c5481f9fc06111dc332 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/_content/coach_group_grading.html
+++ b/src/main/java/org/olat/course/nodes/gta/ui/_content/coach_group_grading.html
@@ -1,7 +1,3 @@
-<div class="o_button_group o_button_group_right">
-	$r.render("coach.assessment")
-</div>
-
 <div class="panel panel-default o_personal">
 	<div class="panel-heading">
  		<h4 class="panel-title">$r.translate("group.title")</h4>
@@ -25,4 +21,7 @@
 		#end
 	</tbody></table>
 	$r.render("group-list")
+</div>
+<div class="o_button_group">
+	$r.render("coach.assessment")
 </div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_content/run.html b/src/main/java/org/olat/course/nodes/gta/ui/_content/run.html
index 4faa590ed866fb7dd24e8608fd88e96131bea975..ebd468edee110f19269be9fed13be2fc77930b24 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/_content/run.html
+++ b/src/main/java/org/olat/course/nodes/gta/ui/_content/run.html
@@ -151,29 +151,6 @@
 		<div class="o_bar"></div>
 		<h4 class="o_title"> <a href="#o_step_grading_content" data-toggle="collapse" aria-expanded="$collapse_grading">$r.translate("run.grading")</a></h4>
 		<div id="o_step_grading_content" class="o_content collpase #if($collapse_grading) in #end" aria-expanded="$collapse_grading">
-			#if($gradingInfoTextUser && !$gradingInfoTextUser.isEmpty())
-			<div class="panel panel-default o_disclaimer">
-			  	<div class="panel-heading" data-toggle="collapse" data-target="#collapseDisclaimer">
-			  		<h4 class="panel-title">
-			  			<i id="collapseDisclaimerToggler" class="o_icon o_icon-fw o_icon_close_togglebox"> </i>
-			  			$r.translate("info.title")
-			  		</h4>
-			  	</div>
-				<div id="collapseDisclaimer" class="panel-collapse collapse in"><div class="panel-body">
-					$r.formatLatexFormulas($gradingInfoTextUser)
-		  		</div></div>
-			</div>
-			<script type="text/javascript">
-				/* <![CDATA[ */
-					jQuery('#collapseDisclaimer').on('hide.bs.collapse', function () {
-						jQuery('#collapseDisclaimerToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
-					})
-					jQuery('#collapseDisclaimer').on('show.bs.collapse', function () {
-						jQuery('#collapseDisclaimerToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
-					})
-				/* ]]> */
-			</script>
-			#end
 			#if($r.available("grading"))
 				$r.render("grading")
 			#end
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties
index ffbf00aa160e3653e316066ec9cb27125bcb282e..3666479e36e28b5cf591452cfed221a46c9ae72e 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties
@@ -3,7 +3,7 @@ add.solution=Musterl\u00F6sung hochladen
 add.task=Aufgabe hinzuf\u00FCgen
 assessment.group.tool=Gruppe bewerten
 assignment.config.title=Aufgabe zuweisen
-assignment.deadline=Zuweisungstermin
+assignment.deadline=Zuweisung bis
 before=vorher
 bulk.download.title=Alle abgegebenen Dokumente herunterladen
 bulk.review=Beurteilung herunterladen
@@ -18,6 +18,7 @@ choosed.groups=Gruppe
 coach.assessment=Bewerten
 coach.close.revision.button=Revisionsprozess schliessen
 coach.corrections.description=Sie haben folgende Korrekturen zur\u00FCckgegeben.
+coach.document=Dokumente
 coach.documents.successfully.reviewed=Begutachtet\!
 coach.need.revision.button=Ben\u00F6tigt \u00DCberarbeitung
 coach.reviewed.button=Begutachtet
@@ -156,7 +157,7 @@ submission.email.confirmation=Diesen Text zus\u00E4tzlich als E-Mail versenden.
 submission.enabled=eingeschaltet
 submission.mail.subject=OpenOLAT-Best\u00E4tigungs-E-Mail
 submission.text=Text nach erfolgter Abgabe
-submit.deadline=Abgabetermin
+submit.deadline=Abgabe bis
 table.header.details.gta=$org.olat.course.nodes.ta\:table.header.details.ta
 table.header.group.name=Gruppe
 table.header.passed=Bestanden
@@ -185,6 +186,6 @@ task.type.description=Wenn die Gruppenaufgabe aktiviert ist, werden alle Abschni
 task.type.title=Aufgabentyp
 upload.document=Dokument hochladen
 wait.for.solutions=Die Musterl\u00F6sung wird zum angegebenen Zeitpunkt freigegeben.
-warning.group.pick.task=Dies ist eine Gruppenaufgabe\! Die hier getroffene Auswahl ist f\u00FCr alle Mitglieder der Gruppe "{0}" g\u00FCltig\! Stellen Sie sicher dass diese Auswahl zuvor innerhalb Ihrer Gruppe diskutiert wurde\! Nur ein Gruppenmitglied kann die Gruppenaufgabe ausw\u00E4len.
+warning.group.pick.task=Dies ist eine Gruppenaufgabe\! Die hier getroffene Auswahl ist f\u00FCr alle Mitglieder der Gruppe "{0}" g\u00FCltig\! Stellen Sie sicher, dass diese Auswahl zuvor innerhalb Ihrer Gruppe diskutiert wurde\! Nur ein Gruppenmitglied kann die Gruppenaufgabe ausw\u00E4hlen.
 warning.group.submit=Dies ist eine Gruppenaufgabe\! Das abgegebene Dokument ist f\u00FCr alle Mitglieder der Gruppe "{0}" g\u00FCltig\! Stellen Sie sicher dass diese L\u00F6sung zuvor innerhalb  Ihrer Gruppe diskutiert wurde\! Nur ein Gruppenmitglied kann eine L\u00F6sung im Namen aller Gruppenmitglieder abgeben.
-warning.group.task=Dies ist eine Gruppenaufgabe\! Aufgbabenzuweisung, Abgabe sowie die Bewertung werden f\u00FCr die Gruppe vorgenommen. Besprechen Sie mit den anderen Teilnehmern ihrer Gruppe wie sie gemeinsam die Aufgabe ausw\u00E4hlen und bearbeiten wollen.
+warning.group.task=Dies ist eine Gruppenaufgabe\! Aufgabenzuweisung, Abgabe sowie die Bewertung werden f\u00FCr die Gruppe vorgenommen. Besprechen Sie mit den anderen Teilnehmern ihrer Gruppe wie sie gemeinsam die Aufgabe ausw\u00E4hlen und bearbeiten wollen.
diff --git a/src/main/java/org/olat/group/ui/main/MemberListTableSort.java b/src/main/java/org/olat/group/ui/main/MemberListTableSort.java
index 4ef5dc89e5a5792e99fc79b02ab6285649f53bce..5624d43b3da6ed8fcf84bc4e54971db535db598b 100644
--- a/src/main/java/org/olat/group/ui/main/MemberListTableSort.java
+++ b/src/main/java/org/olat/group/ui/main/MemberListTableSort.java
@@ -1,3 +1,22 @@
+/**
+ * <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.group.ui.main;
 
 import java.util.Collections;
diff --git a/src/main/java/org/olat/portfolio/manager/EPPolicyManager.java b/src/main/java/org/olat/portfolio/manager/EPPolicyManager.java
index e8fb11890577407c73ee6630545702edd59ddaee..61d160033d3df55ae53d835dc7805a7ec45fa09a 100644
--- a/src/main/java/org/olat/portfolio/manager/EPPolicyManager.java
+++ b/src/main/java/org/olat/portfolio/manager/EPPolicyManager.java
@@ -288,7 +288,7 @@ public class EPPolicyManager {
 	private EPStructureElementToGroupRelation applyPolicyToGroup(Group group, EPMapPolicy policy, PortfolioStructureMap map) {
 		Collection<EPStructureElementToGroupRelation> currentRelations = map.getGroups();
 		for(EPStructureElementToGroupRelation currentRelation:currentRelations) {
-			if(currentRelation.getGroup().equals(group)) {
+			if(currentRelation.getGroup() != null && currentRelation.getGroup().equals(group)) {
 				updatePolicy(currentRelation, policy.getFrom(), policy.getTo());
 				return currentRelation;
 			}
diff --git a/src/main/java/org/olat/portfolio/manager/InvitationDAO.java b/src/main/java/org/olat/portfolio/manager/InvitationDAO.java
index e802be56af7ba69f48b539bd4cd7e5bf49365d13..6e9e1fb8259909982774cd0e4aa38ada0f47cff4 100644
--- a/src/main/java/org/olat/portfolio/manager/InvitationDAO.java
+++ b/src/main/java/org/olat/portfolio/manager/InvitationDAO.java
@@ -131,7 +131,8 @@ public class InvitationDAO {
 	public Invitation findInvitation(Group group) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select invitation from binvitation as invitation ")
-		  .append(" where invitation.baseGroup=:group");
+		  .append(" inner join fetch invitation.baseGroup bGroup")
+		  .append(" where bGroup=:group");
 
 		List<Invitation> invitations = dbInstance.getCurrentEntityManager()
 				  .createQuery(sb.toString(), Invitation.class)
@@ -149,6 +150,7 @@ public class InvitationDAO {
 	public Invitation findInvitation(String token) {
 		StringBuilder sb = new StringBuilder();
 		sb.append("select invitation from binvitation as invitation ")
+		  .append(" inner join fetch invitation.baseGroup bGroup")
 		  .append(" where invitation.token=:token");
 
 		List<Invitation> invitations = dbInstance.getCurrentEntityManager()
diff --git a/src/main/java/org/olat/portfolio/ui/structel/EPMultipleMapController.java b/src/main/java/org/olat/portfolio/ui/structel/EPMultipleMapController.java
index 7b70ec0bbb71ace8e6a9eab66ea3806a1016d871..86a999c3418b3e363de42c203316ea8309d944b2 100644
--- a/src/main/java/org/olat/portfolio/ui/structel/EPMultipleMapController.java
+++ b/src/main/java/org/olat/portfolio/ui/structel/EPMultipleMapController.java
@@ -280,7 +280,7 @@ public class EPMultipleMapController extends BasicController implements Activate
 					EPTargetResource resource = structMap.getTargetResource();
 					RepositoryEntry repoEntry = RepositoryManager.getInstance().lookupRepositoryEntry(resource.getOLATResourceable(), false);
 					if(repoEntry != null) {
-						vC.contextPut("courseName" + i, repoEntry.getDisplayname());
+						vC.contextPut("courseName" + i, StringHelper.escapeHtml(repoEntry.getDisplayname()));
 						String url = Settings.getServerContextPathURI();
 						url += "/url/RepositoryEntry/" + repoEntry.getKey() + "/CourseNode/" + resource.getSubPath();
 						vC.contextPut("courseLink" + i, url);
diff --git a/src/test/java/org/olat/portfolio/manager/InvitationDAOTest.java b/src/test/java/org/olat/portfolio/manager/InvitationDAOTest.java
index c53a6a404d8811b269a5d6f66a3adb3d76fc8492..0d693a13885f99c44c7eed108d22055cc7bcf577 100644
--- a/src/test/java/org/olat/portfolio/manager/InvitationDAOTest.java
+++ b/src/test/java/org/olat/portfolio/manager/InvitationDAOTest.java
@@ -26,6 +26,7 @@ import java.util.UUID;
 
 import org.junit.Assert;
 import org.junit.Test;
+import org.olat.basesecurity.Group;
 import org.olat.basesecurity.Invitation;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
@@ -64,6 +65,21 @@ public class InvitationDAOTest extends OlatTestCase {
 		Assert.assertNotNull(invitation.getToken());
 	}
 	
+	@Test
+	public void findInvitation_group() {
+		Invitation invitation = invitationDao.createAndPersistInvitation();
+		Group baseGroup = invitation.getBaseGroup();
+		Assert.assertNotNull(invitation);
+		dbInstance.commitAndCloseSession();
+		
+		Invitation reloadedInvitation = invitationDao.findInvitation(baseGroup);
+		Assert.assertNotNull(reloadedInvitation);
+		Assert.assertNotNull(reloadedInvitation.getKey());
+		Assert.assertEquals(baseGroup, reloadedInvitation.getBaseGroup());
+		Assert.assertEquals(invitation, reloadedInvitation);
+		Assert.assertEquals(invitation.getToken(), reloadedInvitation.getToken());
+	}
+	
 	@Test
 	public void findInvitation_token() {
 		Invitation invitation = invitationDao.createAndPersistInvitation();
@@ -78,6 +94,7 @@ public class InvitationDAOTest extends OlatTestCase {
 		Assert.assertEquals(invitation.getToken(), reloadedInvitation.getToken());
 	}
 	
+	
 	@Test
 	public void hasInvitationPolicies_testHQL() {
 		String token = UUID.randomUUID().toString();