diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
index 3d0accbf4ed0d73fb1e38a079737639812218c2c..019283e020799d7b82ff934a32b1b6a611d883ed 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
@@ -437,14 +437,21 @@ public class Form {
 	}
 	
 	private final void submit(UserRequest ureq, Event validationOkEvent) {	
+		boolean isValid = validate(ureq);
+		formWrapperComponent.fireValidation(ureq, isValid, validationOkEvent);
+		isValidAndSubmitted = isValid;
+		hasAlreadyFired = true;
+	}
+	
+	public boolean validate(UserRequest ureq) {
 		ValidatingFormComponentVisitor vfcv = new ValidatingFormComponentVisitor();
 		FormComponentTraverser ct = new FormComponentTraverser(vfcv, formLayout, false);
 		ct.visitAll(ureq);
 		// validate all form elements and gather validation status
 		ValidationStatus[] status = vfcv.getStatus();
-		//
+		
 		boolean isValid = status == null || status.length == 0;
-		// let the businesslogic validate this is implemented by the outside listener
+		// let the business logic validate this is implemented by the outside listener
 		
 		for (Iterator<FormBasicController> iterator = formListeners.iterator(); iterator.hasNext();) {
 			FormBasicController fbc = iterator.next();
@@ -452,10 +459,7 @@ public class Form {
 			//let further validate even if one fails.
 			isValid = fbc.validateFormLogic(ureq) && isValid;
 		}
-
-		formWrapperComponent.fireValidation(ureq, isValid, validationOkEvent);
-		isValidAndSubmitted = isValid;
-		hasAlreadyFired = true;
+		return isValid;
 	}
 	
 	
diff --git a/src/main/java/org/olat/modules/forms/ui/EvaluationFormExecutionController.java b/src/main/java/org/olat/modules/forms/ui/EvaluationFormExecutionController.java
index cabb65bb3d9b4277f9e036fa16709c47c0a3752b..f92ba9d0bf3560647ab8b3befa14b629869f384d 100644
--- a/src/main/java/org/olat/modules/forms/ui/EvaluationFormExecutionController.java
+++ b/src/main/java/org/olat/modules/forms/ui/EvaluationFormExecutionController.java
@@ -92,8 +92,6 @@ public class EvaluationFormExecutionController extends FormBasicController imple
 	private boolean readOnly;
 	private boolean showDoneButton;
 
-	private boolean immediateSave = false;
-
 	private EvaluationFormSession session;
 	private final EvaluationFormResponses responses;
 	
@@ -270,11 +268,9 @@ public class EvaluationFormExecutionController extends FormBasicController imple
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (saveLink == source) {
-			immediateSave = true;
-			mainForm.submit(ureq);
-		} else if (doneLink == source) {
-			immediateSave = false;
-			mainForm.submit(ureq);
+			if(mainForm.validate(ureq)) {
+				doSaveResponses();
+			}
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
@@ -292,7 +288,7 @@ public class EvaluationFormExecutionController extends FormBasicController imple
 	@Override
 	protected void formOK(UserRequest ureq) {
 		boolean responsesSaved = doSaveResponses();
-		if (!immediateSave && responsesSaved) {
+		if (responsesSaved) {
 			doConfirmDone(ureq);
 		}
 	}
@@ -342,7 +338,7 @@ public class EvaluationFormExecutionController extends FormBasicController imple
 
 		List<ValidationMessage> messages = new ArrayList<>();
 		validate(ureq, messages);
-		if (messages.size() > 0) {
+		if (!messages.isEmpty()) {
 			for (ValidationMessage message : messages) {
 				sb.append("<p class='o_warning'>").append(message.getMessage()).append("</p>");
 			}
diff --git a/src/main/java/org/olat/modules/forms/ui/TextInputController.java b/src/main/java/org/olat/modules/forms/ui/TextInputController.java
index a01405357f9667098c6a52267a67ffcba348a104..b289e631eda83f30dcf4ee7e860cbdb6bf947402 100644
--- a/src/main/java/org/olat/modules/forms/ui/TextInputController.java
+++ b/src/main/java/org/olat/modules/forms/ui/TextInputController.java
@@ -103,7 +103,7 @@ public class TextInputController extends FormBasicController implements Evaluati
 	
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
-		boolean allOk = true;
+		boolean allOk = super.validateFormLogic(ureq);
 		
 		if (textInput.isNumeric()) {
 			String val = singleRowEl.getValue();
@@ -117,7 +117,7 @@ public class TextInputController extends FormBasicController implements Evaluati
 			}
 		}
 		
-		return allOk & super.validateFormLogic(ureq);
+		return allOk;
 	}
 
 	@Override