diff --git a/src/main/java/org/olat/course/assessment/AssessmentHelper.java b/src/main/java/org/olat/course/assessment/AssessmentHelper.java
index 8d240d2d92239ee8657121659691d2bba5d9734a..ca6fa17dd96de8da39897fd6682838af014afbd3 100644
--- a/src/main/java/org/olat/course/assessment/AssessmentHelper.java
+++ b/src/main/java/org/olat/course/assessment/AssessmentHelper.java
@@ -30,7 +30,6 @@ import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
 import java.text.ParseException;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -57,7 +56,6 @@ import org.olat.course.nodes.CourseNodeConfiguration;
 import org.olat.course.nodes.CourseNodeFactory;
 import org.olat.course.nodes.STCourseNode;
 import org.olat.course.nodes.ScormCourseNode;
-import org.olat.course.nodes.iq.IQEditController;
 import org.olat.course.run.environment.CourseEnvironment;
 import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.scoring.ScoreAccounting;
@@ -65,7 +63,6 @@ import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.course.run.userview.UserCourseEnvironmentImpl;
 import org.olat.course.tree.CourseEditorTreeModel;
 import org.olat.course.tree.CourseEditorTreeNode;
-import org.olat.modules.ModuleConfiguration;
 
 /**
  * Description:<br>
@@ -506,28 +503,4 @@ public class AssessmentHelper {
 		}
 		return numOfChildren + 1;//add itself
 	}
-	
-	/**
-	 * Evaluates if the results are visble or not in respect of the configured CONFIG_KEY_DATE_DEPENDENT_RESULTS parameter. <br>
-	 * The results are always visible if no date dependent, 
-	 * or if date dependent only in the period: startDate-endDate. 
-	 * EndDate could be null, that is there is no restriction for the end date.
-	 * 
-	 * @return true if is visible.
-	 */
-	public static boolean isResultVisible(ModuleConfiguration modConfig) {
-		boolean isVisible = false;
-		Boolean showResultsActive = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS);
-		if(showResultsActive != null && showResultsActive.booleanValue()) {
-			Date startDate = (Date)modConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
-			Date endDate = (Date)modConfig.get(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
-			Date currentDate = new Date();
-			if(startDate != null && currentDate.after(startDate) && (endDate == null || currentDate.before(endDate))) {
-				isVisible = true;
-			}
-		} else {
-			isVisible = true;
-		}
-		return isVisible;
-	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/nodes/iq/IQ12EditForm.java b/src/main/java/org/olat/course/nodes/iq/IQ12EditForm.java
index 67ea2ea50325a8b9a36fddd28f88078de432d826..87fdb604f7db669c44b7f605763bdea483c376a2 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQ12EditForm.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQ12EditForm.java
@@ -161,7 +161,7 @@ public class IQ12EditForm extends FormBasicController {
 		if (!isSurvey) {
 			modConfig.set(IQEditController.CONFIG_KEY_SUMMARY, getSummary());
 			modConfig.set(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, new Boolean(isShowResultsDateDependent()));
-			modConfig.set(IQEditController.CONFIG_KEY_RESULTS_START_DATE, getShowResultsStartDate());
+			modConfig.set(IQEditController.CONFIG_KEY_RESULTS_START_DATE, getShowResultsStartDate()); 
 			modConfig.set(IQEditController.CONFIG_KEY_RESULTS_END_DATE, getShowResultsEndDate());
 			modConfig.set(IQEditController.CONFIG_KEY_RESULT_ON_FINISH, isShowResultsAfterFinishTest());
 			modConfig.set(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE, isShowResultsOnHomePage());
@@ -238,8 +238,8 @@ public class IQ12EditForm extends FormBasicController {
 		}
 	
 		Date startDate = null;
-		if(modConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE) instanceof Date) {
-			startDate = (Date)modConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
+		if(modConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE) instanceof Date) { 
+			startDate = (Date)modConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE); 
 		}
 		startDateElement = uifactory.addDateChooser("qti_form_start_date", "qti.form.date.start", null, formLayout);
 		startDateElement.setDateChooserTimeEnabled(true);
diff --git a/src/main/java/org/olat/course/nodes/iq/IQEditController.java b/src/main/java/org/olat/course/nodes/iq/IQEditController.java
index 5ccffae1ab861376fe2d6b877b64a839dd6ede2e..18b806325109a7c5cb7fb79ac6736c922c690b60 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQEditController.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQEditController.java
@@ -147,13 +147,17 @@ public class IQEditController extends ActivateableTabbableDefaultController impl
 	public static final String CONFIG_KEY_DATE_DEPENDENT_RESULTS = "dateDependentResults";
 	public static final String CONFIG_KEY_RESULTS_START_DATE = "resultsStartDate";
 	public static final String CONFIG_KEY_RESULTS_END_DATE = "resultsEndDate";
+	public static final String CONFIG_KEY_RESULTS_FAILED_START_DATE = "failedResultsStartDate";
+	public static final String CONFIG_KEY_RESULTS_FAILED_END_DATE = "failedResultsEndDate";
+	public static final String CONFIG_KEY_RESULTS_PASSED_START_DATE = "passedResultsStartDate";
+	public static final String CONFIG_KEY_RESULTS_PASSED_END_DATE = "passedResultsEndDate";
 	public static final String CONFIG_KEY_RESULT_ON_FINISH = "showResultsOnFinish";
 	public static final String CONFIG_KEY_RESULT_ON_HOME_PAGE = "showResultsOnHomePage";
 
 	public static final String CONFIG_KEY_IGNORE_IN_COURSE_ASSESSMENT = MSCourseNode.CONFIG_KEY_IGNORE_IN_COURSE_ASSESSMENT;
 	public static final String CONFIG_KEY_DATE_DEPENDENT_TEST = "dateDependentTest";
-	public static final String CONFIG_KEY_RESULTS_START_TEST_DATE = "resultsStartTestDate";
-	public static final String CONFIG_KEY_RESULTS_END_TEST_DATE = "resultsEndTestDate";
+	public static final String CONFIG_KEY_START_TEST_DATE = "resultsStartTestDate";
+	public static final String CONFIG_KEY_END_TEST_DATE = "resultsEndTestDate";
 
 	public static final String CONFIG_KEY_TEMPLATE = "templateid";
 	public static final String CONFIG_KEY_TYPE_QTI = "qtitype";
@@ -161,6 +165,11 @@ public class IQEditController extends ActivateableTabbableDefaultController impl
 	public static final String CONFIG_VALUE_QTI21 = "qti2w";
 	public static final Object CONFIG_VALUE_QTI1 = "qti1";
 	public static final String CONFIG_KEY_IS_SURVEY = "issurv";
+	
+	public static final String CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS = "false";
+	public static final String CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY = "failedOnly";
+	public static final String CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT = "different";
+	public static final String CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME = "true";
 
 	
 	private final String[] paneKeys;
diff --git a/src/main/java/org/olat/course/nodes/iq/IQRunController.java b/src/main/java/org/olat/course/nodes/iq/IQRunController.java
index b95d5300a9e2e9082f710a7c9edf87b0e7c7e7a2..ce49f699fb66a15b9127f736d5a96c411cfa5c43 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQRunController.java
@@ -717,7 +717,7 @@ public class IQRunController extends BasicController implements GenericEventList
 			boolean showResultsOnHomePage = (showResultsObj!=null && showResultsObj.booleanValue());
 			myContent.contextPut("showResultsOnHomePage",new Boolean(showResultsOnHomePage));
 			myContent.contextPut("in-results", isPanelOpen(ureq, "results", true));
-			boolean dateRelatedVisibility = AssessmentHelper.isResultVisible(modConfig);		
+			boolean dateRelatedVisibility = isResultVisible();		
 			if(showResultsOnHomePage && dateRelatedVisibility) {
 				myContent.contextPut("showResultsVisible",Boolean.TRUE);
 				showResultsButton = LinkFactory.createButton("command.showResults", myContent, this);
@@ -736,6 +736,71 @@ public class IQRunController extends BasicController implements GenericEventList
 			}
 		}		
 	}
+	
+	/**
+	 * Evaluates if the results are visble or not in respect of the configured CONFIG_KEY_DATE_DEPENDENT_RESULTS parameter. <br>
+	 * The results are always visible if not date dependent.
+	 * EndDate could be null, that is there is no restriction for the end date.
+	 * 
+	 * @return true if is visible.
+	 */
+	private boolean isResultVisible() {
+		boolean isVisible = false;
+		String showResultsActive = modConfig.getStringValue(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS);
+		Date startDate, endDate;
+		Date passedStartDate, passedEndDate;
+		Date failedStartDate, failedEndDate;
+		Date currentDate;
+		ScoreEvaluation scoreEval = courseAssessmentService.getAssessmentEvaluation(courseNode, userCourseEnv);
+		
+		switch (showResultsActive) {
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS:
+			isVisible = true;
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT:
+			passedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE);
+			passedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE);
+			currentDate = new Date();
+			if(scoreEval.getPassed() && passedStartDate != null && currentDate.after(passedStartDate) && (passedEndDate == null || currentDate.before(passedEndDate))) {
+				isVisible = true;
+				break;
+			}
+			
+			failedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE);
+			failedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE);
+			if(!scoreEval.getPassed() && failedStartDate != null && currentDate.after(failedStartDate) && (failedEndDate == null || currentDate.before(failedEndDate))) {
+				isVisible = true;
+				break;
+			}
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY:
+			if (scoreEval.getPassed()) {
+				isVisible = false;
+				break;
+			}
+			currentDate = new Date();
+			failedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE);
+			failedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE);
+			if(!scoreEval.getPassed() && failedStartDate != null && currentDate.after(failedStartDate) && (failedEndDate == null || currentDate.before(failedEndDate))) {
+				isVisible = true;
+				break;
+			}
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME:
+			startDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
+			endDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
+			currentDate = new Date();
+			if(startDate != null && currentDate.after(startDate) && (endDate == null || currentDate.before(endDate))) {
+				isVisible = true;
+			}
+			break;
+		default:
+			isVisible = true;
+			break;
+		}
+
+		return isVisible;
+	}
 
 	private void exposeUserQuestionnaireDataToVC() {
 		AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
index bab766a50367b1c2ae4c031f4e26decd3b95cffb..e72382770c69f17945b5a5600f1381a4d4bddbe2 100644
--- a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
@@ -273,9 +273,9 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 				mainVC.contextPut("passed", scoreEval.getPassed());
 				mainVC.contextPut("attempts", attempts); //at least one attempt
 				mainVC.contextPut("showChangeLog", Boolean.TRUE && enableScoreInfo);
-				exposeResults(ureq, true);
+				exposeResults(ureq, true, scoreEval.getPassed());
 			} else {
-				exposeResults(ureq, false);
+				exposeResults(ureq, false, false);
 			}
 		} else if(courseNode instanceof IQTESTCourseNode) {
 			IQTESTCourseNode testCourseNode = (IQTESTCourseNode)courseNode;
@@ -294,11 +294,11 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 					mainVC.contextPut("enableScoreInfo", Boolean.FALSE);
 				}
 			} else {
-				Boolean passed = assessmentEntry.getPassed();
+				boolean passed = assessmentEntry.getPassed() != null && assessmentEntry.getPassed().booleanValue();
 				//block if test passed (and config set to check it)
 				Boolean blocked = Boolean.FALSE;
 				boolean blockAfterSuccess = deliveryOptions.isBlockAfterSuccess();
-				if(blockAfterSuccess && passed != null && passed.booleanValue()) {
+				if(blockAfterSuccess && passed) {
 					blocked = Boolean.TRUE;
 				}
 				mainVC.contextPut("blockAfterSuccess", blocked);
@@ -306,7 +306,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 				boolean resultsVisible = assessmentEntry.getUserVisibility() == null || assessmentEntry.getUserVisibility().booleanValue();
 				mainVC.contextPut("resultsVisible", resultsVisible);
 				mainVC.contextPut("score", AssessmentHelper.getRoundedScore(assessmentEntry.getScore()));
-				mainVC.contextPut("hasPassedValue", (passed == null ? Boolean.FALSE : Boolean.TRUE));
+				mainVC.contextPut("hasPassedValue", (assessmentEntry.getPassed() == null ? Boolean.FALSE : Boolean.TRUE));
 				mainVC.contextPut("passed", passed);
 				if(resultsVisible) {
 					if(assessmentConfig.hasComment()) {
@@ -349,7 +349,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 					}
 				}
 
-				exposeResults(ureq, resultsVisible);
+				exposeResults(ureq, resultsVisible, passed);
 			}
 		}
 	}
@@ -360,12 +360,12 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 		
 		boolean dependOnDate = config.getBooleanSafe(IQEditController.CONFIG_KEY_DATE_DEPENDENT_TEST, false);
 		if(dependOnDate) {
-			Date startTestDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_TEST_DATE);
+			Date startTestDate = config.getDateValue(IQEditController.CONFIG_KEY_START_TEST_DATE);
 			if(startTestDate != null) {
 				Formatter formatter = Formatter.getInstance(getLocale());
 				mainVC.contextPut("startTestDate", formatter.formatDateAndTime(startTestDate));
 				
-				Date endTestDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_TEST_DATE);
+				Date endTestDate = config.getDateValue(IQEditController.CONFIG_KEY_END_TEST_DATE);
 				if(endTestDate != null) {
 					mainVC.contextPut("endTestDate", formatter.formatDateAndTime(endTestDate));
 				}
@@ -401,15 +401,16 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 	 * in the velocity template and the CONFIG_KEY_RESULT_ON_HOME_PAGE is not editable
 	 * in the configuration of the course element for QTI 2.1!!!!
 	 * 
-	 * Provides the show results button if results available or a message with the visibility period.
+	 * Provides the show results button if results available or a message with the visibility period 
+	 * if there is difference when displaying passed or failed results.
 	 * 
 	 * @param ureq
 	 */
-	private void exposeResults(UserRequest ureq, boolean resultsVisible) {
+	private void exposeResults(UserRequest ureq, boolean resultsAvailable, boolean passed) {
 		//migration: check if old tests have no summary configured
 		boolean showResultsOnHomePage = config.getBooleanSafe(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE);
 		QTI21AssessmentResultsOptions showSummary = deliveryOptions.getAssessmentResultsOptions();
-		if(resultsVisible && !showSummary.none()) {
+		if(resultsAvailable && !showSummary.none()) {
 			mainVC.contextPut("showResultsOnHomePage", Boolean.valueOf(showResultsOnHomePage));			
 			boolean dateRelatedVisibility = isResultVisible(config);		
 			if(showResultsOnHomePage && dateRelatedVisibility) {
@@ -426,61 +427,215 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 				if(isPanelOpen(ureq, "results", true)) {
 					doShowResults(ureq);
 				}
-			} else if(showResultsOnHomePage) {
-				exposeVisiblityPeriod();
-				mainVC.contextPut("showResultsVisible", Boolean.FALSE);
 			} else {
-				exposeVisiblityPeriod();
+				exposeVisiblityPeriod(passed);
 				mainVC.contextPut("showResultsVisible", Boolean.FALSE);
 			}
 		} else {
-			exposeVisiblityPeriod();
+			exposeVisiblityPeriod(passed);
 			mainVC.contextPut("showResultsVisible", Boolean.FALSE);
 			mainVC.contextPut("showResultsOnHomePage", Boolean.valueOf(showResultsOnHomePage && !showSummary.none()));	
 		}
 		
-		if(!anonym && resultsVisible && userCourseEnv.isParticipant()) {
+		if(!anonym && resultsAvailable && userCourseEnv.isParticipant()) {
 			UserNodeAuditManager am = userCourseEnv.getCourseEnvironment().getAuditManager();
 			String userLog = am.getUserNodeLog(courseNode, getIdentity());
 			mainVC.contextPut("log", StringHelper.escapeHtml(userLog));	
 		}
 	}
 	
-	private void exposeVisiblityPeriod() {
-		boolean showResultsActive = config.getBooleanSafe(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS);
-		Date startDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
-		Date endDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
-		if(showResultsActive && startDate != null) {
-			Formatter formatter = Formatter.getInstance(getLocale());
-			String visibilityStartDate = formatter.formatDate(startDate);
-			String visibilityEndDate = "-";
-			if(endDate != null) {
-				visibilityEndDate = formatter.formatDate(endDate);
+	private void exposeVisiblityPeriod(boolean passed) {
+		String showResultsActive = config.getStringValue(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS);
+		
+		Date startDate;
+		Date endDate;
+		Date currentDate = new Date();
+		
+		switch (showResultsActive) {
+		
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS:
+			mainVC.contextPut("visibilityPeriod", translate("showResults.visibility.future"));
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT:
+			if (passed) {
+				startDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE);
+				endDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE);
+				
+				if(startDate != null && currentDate.before(startDate)) {
+					Formatter formatter = Formatter.getInstance(getLocale());
+					String visibilityStartDate = formatter.formatDate(startDate);
+					String visibilityEndDate = "-";
+					if(endDate != null && currentDate.before(endDate)) {
+						visibilityEndDate = formatter.formatDate(endDate);
+					} else if(endDate != null && currentDate.after(endDate)) {
+						String visibilityPeriod = translate("showResults.visibility.past");
+						mainVC.contextPut("visibilityPeriod", visibilityPeriod);
+						break;
+					}
+					String visibilityPeriod = translate("showResults.visibility", new String[] { visibilityStartDate, visibilityEndDate });
+					mainVC.contextPut("visibilityPeriod", visibilityPeriod);
+					break;
+				}
+			} else {
+				startDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE);
+				endDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE);
+				
+				if(startDate != null && currentDate.before(startDate)) {
+					Formatter formatter = Formatter.getInstance(getLocale());
+					String visibilityStartDate = formatter.formatDate(startDate);
+					String visibilityEndDate = "-";
+					if(endDate != null && currentDate.before(endDate)) {
+						visibilityEndDate = formatter.formatDate(endDate);
+					} else if(endDate != null && currentDate.after(endDate)) {
+						String visibilityPeriod = translate("showResults.visibility.past");
+						mainVC.contextPut("visibilityPeriod", visibilityPeriod);
+						break;
+					}
+					String visibilityPeriod = translate("showResults.visibility", new String[] { visibilityStartDate, visibilityEndDate });
+					mainVC.contextPut("visibilityPeriod", visibilityPeriod);
+					break;
+				}
 			}
-			String visibilityPeriod = translate("showResults.visibility", new String[] { visibilityStartDate, visibilityEndDate });
-			mainVC.contextPut("visibilityPeriod", visibilityPeriod);
-		} else {
 			mainVC.contextPut("visibilityPeriod", translate("showResults.visibility.future"));
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY:
+			if (!passed) {
+				startDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE);
+				endDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE);
+				
+				if(startDate != null && currentDate.before(startDate)) {
+					Formatter formatter = Formatter.getInstance(getLocale());
+					String visibilityStartDate = formatter.formatDate(startDate);
+					String visibilityEndDate = "-";
+					if(endDate != null && currentDate.before(endDate)) {
+						visibilityEndDate = formatter.formatDate(endDate);
+					} else if(endDate != null && currentDate.after(endDate)) {
+						String visibilityPeriod = translate("showResults.visibility.past");
+						mainVC.contextPut("visibilityPeriod", visibilityPeriod);
+						break;
+					}
+					String visibilityPeriod = translate("showResults.visibility", new String[] { visibilityStartDate, visibilityEndDate });
+					mainVC.contextPut("visibilityPeriod", visibilityPeriod);
+					break;
+				}
+			} else {
+				mainVC.contextPut("showResultsOnHomePage", Boolean.valueOf(false));
+				break;
+			}
+			mainVC.contextPut("visibilityPeriod", translate("showResults.visibility.future"));
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME:
+			startDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
+			endDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
+			
+			if(startDate != null && currentDate.before(startDate)) {
+				Formatter formatter = Formatter.getInstance(getLocale());
+				String visibilityStartDate = formatter.formatDate(startDate);
+				String visibilityEndDate = "-";
+				if(endDate != null && currentDate.before(endDate)) {
+					visibilityEndDate = formatter.formatDate(endDate);
+				} else if(endDate != null && currentDate.after(endDate)) {
+					String visibilityPeriod = translate("showResults.visibility.past");
+					mainVC.contextPut("visibilityPeriod", visibilityPeriod);
+					break;
+				}
+				String visibilityPeriod = translate("showResults.visibility", new String[] { visibilityStartDate, visibilityEndDate });
+				mainVC.contextPut("visibilityPeriod", visibilityPeriod);
+				break;
+			}
+			mainVC.contextPut("visibilityPeriod", translate("showResults.visibility.future"));
+			break;
+		default:
+			mainVC.contextPut("visibilityPeriod", translate("showResults.visibility.future"));
+			break;
 		}
 	}
 	
+	/**
+	 * Evaluates if the results are visble or not in respect of the configured CONFIG_KEY_DATE_DEPENDENT_RESULTS parameter. <br>
+	 * The results are always visible if not date dependent.
+	 * EndDate could be null, that is there is no restriction for the end date.
+	 * 
+	 * @return true if is visible.
+	 */
 	private boolean isResultVisible(ModuleConfiguration modConfig) {
 		boolean isVisible = false;
-		boolean showResultsActive = modConfig.getBooleanSafe(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS);
-		if(showResultsActive) {
-			Date startDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
-			Date endDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
-			if(startDate == null && endDate == null) {
-				isVisible = true;
+		String showResultsActive = modConfig.getStringValue(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS);
+		Date startDate, endDate;
+		Date passedStartDate, passedEndDate;
+		Date failedStartDate, failedEndDate;
+		ScoreEvaluation scoreEval = courseAssessmentService.getAssessmentEvaluation(courseNode, userCourseEnv);
+		
+		switch (showResultsActive) {
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS:
+			isVisible = true;
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT:
+			passedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE);
+			passedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE);
+			failedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE);
+			failedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE);
+			
+			isVisible = isResultVisible(scoreEval, passedStartDate, passedEndDate, failedStartDate, failedEndDate);
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY:
+			failedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE);
+			failedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE);
+			
+			isVisible = isResultVisibleFailedOnly(scoreEval, failedStartDate, failedEndDate);
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME:
+			startDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
+			endDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
+			isVisible = isResultVisible(startDate, endDate);
+			break;
+		default:
+			break;
+		}
+
+		return isVisible;
+	}
+	
+	private boolean isResultVisible(Date startDate, Date endDate) {
+		boolean isVisible = true;
+		Date currentDate = new Date();
+		
+		if (startDate != null && currentDate.before(startDate)) {
+			isVisible &= false;
+		} 
+		
+		if (endDate != null && currentDate.after(endDate)) {
+			isVisible &= false;
+		}
+		
+		return isVisible;
+	}
+	
+	private boolean isResultVisibleFailedOnly(ScoreEvaluation scoreEval, Date startDate, Date endDate) {
+		boolean isVisible = scoreEval != null;
+		
+		if (isVisible) {			
+			if (scoreEval.getPassed() != null && !scoreEval.getPassed().booleanValue()) {
+				isVisible &= isResultVisible(startDate, endDate);
 			} else {
-				Date currentDate = new Date();
-				if(startDate != null && currentDate.after(startDate) && (endDate == null || currentDate.before(endDate))) {
-					isVisible = true;
-				}
+				isVisible &= false;
+			}
+		}
+		
+		return isVisible;
+	}
+	
+	private boolean isResultVisible(ScoreEvaluation scoreEval, Date passedStartDate, Date passedEndDate, Date failedStartDate, Date failedEndDate) {
+		boolean isVisible = scoreEval != null;
+		
+		if (isVisible) {
+			if (scoreEval.getPassed()) {
+				isVisible &= isResultVisible(passedStartDate, passedEndDate);
+			} else {
+				isVisible &= isResultVisible(failedStartDate, failedEndDate);
 			}
-		} else {
-			isVisible = true;
 		}
+		
 		return isVisible;
 	}
 	
@@ -749,9 +904,9 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 		Date endTestDate = null;
 		boolean dependOnDate = config.getBooleanSafe(IQEditController.CONFIG_KEY_DATE_DEPENDENT_TEST, false);
 		if(dependOnDate) {
-			startTestDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_TEST_DATE);
+			startTestDate = config.getDateValue(IQEditController.CONFIG_KEY_START_TEST_DATE);
 			if(startTestDate != null) {
-				endTestDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_TEST_DATE);
+				endTestDate = config.getDateValue(IQEditController.CONFIG_KEY_END_TEST_DATE);
 			}
 		}
 		
diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java b/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java
index e389eb100e52f35cfe123b35f6a0e25b541516b3..428763555258886f3025e409dbfde064b0b0cc14 100644
--- a/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java
+++ b/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java
@@ -73,13 +73,25 @@ public class QTI21EditForm extends FormBasicController {
 			QTI21AssessmentResultsOptions.QUESTION_SUMMARY,
 			QTI21AssessmentResultsOptions.USER_SOLUTIONS, QTI21AssessmentResultsOptions.CORRECT_SOLUTIONS
 	};
+	private static final String dateBase = "date.";
+	private static final String[] dateKeys = new String[] { 
+			"no",
+			IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS,
+			IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY,
+			IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT,
+			IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME,
+	};
+	private static final String[] dateValues = new String[dateKeys.length];
 
 	private SingleSelection correctionModeEl;
-	private MultipleSelectionElement showResultsOnHomePage;
+	private SingleSelection showResultsDateDependentEl;
 	private MultipleSelectionElement scoreInfo;
-	private MultipleSelectionElement showResultsDateDependentButton;
-	private DateChooser endDateElement;
-	private DateChooser startDateElement;
+	private DateChooser generalEndDateElement;
+	private DateChooser generalStartDateElement;
+	private DateChooser failedEndDateElement;
+	private DateChooser failedStartDateElement;
+	private DateChooser passedEndDateElement;
+	private DateChooser passedStartDateElement;
 	private MultipleSelectionElement testDateDependentEl;
 	private DateChooser startTestDateElement;
 	private DateChooser endTestDateElement;
@@ -112,6 +124,10 @@ public class QTI21EditForm extends FormBasicController {
 		this.deliveryOptions = (deliveryOptions == null ? new QTI21DeliveryOptions() : deliveryOptions);
 		this.needManualCorrection = needManualCorrection;
 		
+		for (int i = 0; i < dateKeys.length; i++) {
+			dateValues[i] = translate(dateBase + dateKeys[i]);
+		}
+		
 		initForm(ureq);
 	}
 
@@ -156,12 +172,12 @@ public class QTI21EditForm extends FormBasicController {
 		testDateDependentEl.setHelpTextKey("qti.form.test.date.help", null);
 		testDateDependentEl.addActionListener(FormEvent.ONCLICK);
 	
-		Date startTestDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_TEST_DATE);
+		Date startTestDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_START_TEST_DATE);
 		startTestDateElement = uifactory.addDateChooser("qti_form_start_test_date", "qti.form.date.start", startTestDate, formLayout);
 		startTestDateElement.setDateChooserTimeEnabled(true);
 		startTestDateElement.setMandatory(true);
 		
-		Date endTestDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_TEST_DATE);
+		Date endTestDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_END_TEST_DATE);
 		endTestDateElement = uifactory.addDateChooser("qti_form_end_test_date", "qti.form.date.end", endTestDate, formLayout);
 		endTestDateElement.setDateChooserTimeEnabled(true);
 	}
@@ -206,29 +222,44 @@ public class QTI21EditForm extends FormBasicController {
 		}
 		scoreInfo.addActionListener(FormEvent.ONCLICK);
 		
-		boolean showResultOnHomePage = modConfig.getBooleanSafe(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE);
-		showResultsOnHomePage = uifactory.addCheckboxesHorizontal("qti_enableResultsOnHomePage", "qti.form.results.onhomepage", formLayout, new String[]{"xx"}, new String[]{null});
-		if(showResultOnHomePage) {
-			showResultsOnHomePage.select("xx", showResultOnHomePage);
-		}
-		showResultsOnHomePage.setElementCssClass("o_sel_results_on_homepage");
-		showResultsOnHomePage.addActionListener(FormEvent.ONCLICK);
-		
-		boolean showResultsDateDependent = modConfig.getBooleanSafe(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS);
-		showResultsDateDependentButton = uifactory.addCheckboxesHorizontal("qti_showresult", "qti.form.show.results", formLayout, new String[]{"xx"}, new String[]{null});
-		showResultsDateDependentButton.select("xx", showResultsDateDependent);
-		showResultsDateDependentButton.addActionListener(FormEvent.ONCLICK);
+		boolean showResultOnHomePage = modConfig.getBooleanSafe(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE);		
+		String showResultsDateDependent = modConfig.getStringValue(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS);  
+		showResultsDateDependentEl = uifactory.addDropdownSingleselect("qti_showresult", "qti.form.results.onhomepage", formLayout, dateKeys, dateValues);
+		showResultsDateDependentEl.select(showResultOnHomePage ? showResultsDateDependent : "no", true);
+		showResultsDateDependentEl.addActionListener(FormEvent.ONCHANGE);
 	
-		Date startDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
-		startDateElement = uifactory.addDateChooser("qti_form_start_date", "qti.form.date.start", null, formLayout);
-		startDateElement.setDateChooserTimeEnabled(true);
-		startDateElement.setDate(startDate);
-		startDateElement.setMandatory(true);
+		Date generalStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
+		generalStartDateElement = uifactory.addDateChooser("qti_form__general_start_date", "qti.form.date.start", null, formLayout);
+		generalStartDateElement.setDateChooserTimeEnabled(true);
+		generalStartDateElement.setDate(generalStartDate);
+		generalStartDateElement.setMandatory(true);
+		
+		Date generalEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
+		generalEndDateElement = uifactory.addDateChooser("qti_form_general_end_date", "qti.form.date.end", null, formLayout);
+		generalEndDateElement.setDateChooserTimeEnabled(true);
+		generalEndDateElement.setDate(generalEndDate);
+		
+		Date failedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
+		failedStartDateElement = uifactory.addDateChooser("qti_form_failed_start_date", "qti.form.date.failed.start", null, formLayout);
+		failedStartDateElement.setDateChooserTimeEnabled(true);
+		failedStartDateElement.setDate(failedStartDate);
+		failedStartDateElement.setMandatory(true);
 		
-		Date endDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
-		endDateElement = uifactory.addDateChooser("qti_form_end_date", "qti.form.date.end", null, formLayout);
-		endDateElement.setDateChooserTimeEnabled(true);
-		endDateElement.setDate(endDate);
+		Date failedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
+		failedEndDateElement = uifactory.addDateChooser("qti_form_failed_end_date", "qti.form.date.end", null, formLayout);
+		failedEndDateElement.setDateChooserTimeEnabled(true);
+		failedEndDateElement.setDate(failedEndDate);
+		
+		Date passedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
+		passedStartDateElement = uifactory.addDateChooser("qti_form_passed_start_date", "qti.form.date.passed.start", null, formLayout);
+		passedStartDateElement.setDateChooserTimeEnabled(true);
+		passedStartDateElement.setDate(passedStartDate);
+		passedStartDateElement.setMandatory(true);
+		
+		Date passedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
+		passedEndDateElement = uifactory.addDateChooser("qti_form_passed_end_date", "qti.form.date.end", null, formLayout);
+		passedEndDateElement.setDateChooserTimeEnabled(true);
+		passedEndDateElement.setDate(passedEndDate);
 		
 		QTI21AssessmentResultsOptions resultsOptions = deliveryOptions.getAssessmentResultsOptions();
 		if(!AssessmentInstance.QMD_ENTRY_SUMMARY_COMPACT.equals(modConfig.getStringValue(IQEditController.CONFIG_KEY_SUMMARY))) {
@@ -299,25 +330,54 @@ public class QTI21EditForm extends FormBasicController {
 			}
 		}
 
-		startDateElement.clearError();
-		if(showResultsDateDependentButton.isSelected(0)) {
-			if(startDateElement.getDate() == null) {
-				startDateElement.setErrorKey("form.legende.mandatory", null);
+		generalStartDateElement.clearError();
+		
+		switch (showResultsDateDependentEl.getSelectedKey()) {			
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT:
+			if(passedStartDateElement.getDate() == null) {
+				passedStartDateElement.setErrorKey("form.legende.mandatory", null);
 				allOk &= false;
-			} else if(endDateElement.getDate() != null && startDateElement.getDate().after(endDateElement.getDate())) {
-				startDateElement.setErrorKey("error.begin.after.end", null);
+			} else if(passedEndDateElement.getDate() != null && passedStartDateElement.getDate().after(passedEndDateElement.getDate())) {
+				passedStartDateElement.setErrorKey("error.begin.after.end", null);
+				allOk &= false;
+			} 
+			
+			if(failedStartDateElement.getDate() == null) {
+				failedStartDateElement.setErrorKey("form.legende.mandatory", null);
+				allOk &= false;
+			} else if(failedEndDateElement.getDate() != null && failedStartDateElement.getDate().after(failedEndDateElement.getDate())) {
+				failedStartDateElement.setErrorKey("error.begin.after.end", null);
 				allOk &= false;
 			}
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY:
+			if(failedStartDateElement.getDate() == null) {
+				failedStartDateElement.setErrorKey("form.legende.mandatory", null);
+				allOk &= false;
+			} else if(failedEndDateElement.getDate() != null && failedStartDateElement.getDate().after(failedEndDateElement.getDate())) {
+				failedStartDateElement.setErrorKey("error.begin.after.end", null);
+				allOk &= false;
+			}
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME:
+			if(generalStartDateElement.getDate() == null) {
+				generalStartDateElement.setErrorKey("form.legende.mandatory", null);
+				allOk &= false;
+			} else if(generalEndDateElement.getDate() != null && generalStartDateElement.getDate().after(generalEndDateElement.getDate())) {
+				generalStartDateElement.setErrorKey("error.begin.after.end", null);
+				allOk &= false;
+			}
+			break;
+		default:
+			break;
 		}
-
+		
 		return allOk;
 	}
 
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
-		if(showResultsOnFinishEl == source
-				|| showResultsOnHomePage == source
-				|| showResultsDateDependentButton == source) {
+		if(showResultsOnFinishEl == source || showResultsDateDependentEl == source) {
 			update();
 		} else if(testDateDependentEl == source) {
 			if(testDateDependentEl.isAtLeastSelected(1)) {
@@ -330,15 +390,70 @@ public class QTI21EditForm extends FormBasicController {
 	}
 	
 	private void update() {
-		showResultsDateDependentButton.setVisible(showResultsOnHomePage.isSelected(0));
-
-		assessmentResultsOnFinishEl.setVisible(showResultsOnFinishEl.isSelected(0) || showResultsOnHomePage.isSelected(0));
-
-		resetDateChooser(startDateElement, showResultsDateDependentButton);
-		resetDateChooser(endDateElement, showResultsDateDependentButton);
+		assessmentResultsOnFinishEl.setVisible(showResultsOnFinishEl.isSelected(0) || !showResultsDateDependentEl.isSelected(0));
+		
+		resetDateChooser(generalStartDateElement);
+		resetDateChooser(generalEndDateElement);
+		resetDateChooser(failedStartDateElement);
+		resetDateChooser(failedEndDateElement);
+		resetDateChooser(passedStartDateElement);
+		resetDateChooser(passedEndDateElement);
 		
 		resetDateChooser(startTestDateElement, testDateDependentEl);
 		resetDateChooser(endTestDateElement, testDateDependentEl);
+
+		switch (showResultsDateDependentEl.getSelectedKey()) {
+		case "no":
+			generalStartDateElement.setVisible(false);
+			generalEndDateElement.setVisible(false);
+			failedStartDateElement.setVisible(false);
+			failedEndDateElement.setVisible(false);
+			passedStartDateElement.setVisible(false);
+			passedEndDateElement.setVisible(false);
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT:
+			generalStartDateElement.setVisible(false);
+			generalEndDateElement.setVisible(false);
+			failedStartDateElement.setVisible(true);
+			failedStartDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE));
+			failedEndDateElement.setVisible(true);
+			failedEndDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE));
+			passedStartDateElement.setVisible(true);
+			passedStartDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE));
+			passedEndDateElement.setVisible(true);
+			passedEndDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE));
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY:
+			generalStartDateElement.setVisible(false);
+			generalEndDateElement.setVisible(false);
+			failedStartDateElement.setVisible(true);
+			failedStartDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE));
+			failedEndDateElement.setVisible(true);
+			failedEndDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE));
+			passedStartDateElement.setVisible(false);
+			passedEndDateElement.setVisible(false);
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS:
+			generalStartDateElement.setVisible(false);
+			generalEndDateElement.setVisible(false);
+			failedStartDateElement.setVisible(false);
+			failedEndDateElement.setVisible(false);
+			passedStartDateElement.setVisible(false);
+			passedEndDateElement.setVisible(false);
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME:
+			generalStartDateElement.setVisible(true);
+			generalStartDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE));
+			generalEndDateElement.setVisible(true);
+			generalEndDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE));
+			failedStartDateElement.setVisible(false);
+			failedEndDateElement.setVisible(false);
+			passedStartDateElement.setVisible(false);
+			passedEndDateElement.setVisible(false);
+			break;
+		default:
+			break;
+		}
 	}
 	
 	private void resetDateChooser(DateChooser dateElement, MultipleSelectionElement parentEl) {
@@ -347,6 +462,13 @@ public class QTI21EditForm extends FormBasicController {
 			dateElement.setValue("");
 		}
 		dateElement.setVisible(parentEl.isVisible() && parentEl.isSelected(0));
+	}  
+	
+	private void resetDateChooser(DateChooser dateElement) {
+		dateElement.clearError();
+		if (!dateElement.isVisible()){
+			dateElement.setValue("");
+		}
 	}
 	
 	private void updateAssessmentResultsOnFinish(QTI21AssessmentResultsOptions resultsOptions) {
@@ -423,23 +545,61 @@ public class QTI21EditForm extends FormBasicController {
 		
 		modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_DATE_DEPENDENT_TEST, testDateDependentEl.isSelected(0));
 		
-		modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_START_TEST_DATE, startTestDateElement.getDate());
-		modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_END_TEST_DATE, endTestDateElement.getDate());
+		modConfig.setDateValue(IQEditController.CONFIG_KEY_START_TEST_DATE, startTestDateElement.getDate());
+		modConfig.setDateValue(IQEditController.CONFIG_KEY_END_TEST_DATE, endTestDateElement.getDate());
 		
 		if(correctionModeEl.isOneSelected()) {
 			modConfig.setStringValue(IQEditController.CONFIG_CORRECTION_MODE, correctionModeEl.getSelectedKey());
 		}
 
 		modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_ENABLESCOREINFO, scoreInfo.isSelected(0));
-		modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, showResultsDateDependentButton.isSelected(0));
+		modConfig.setStringValue(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, showResultsDateDependentEl.getSelectedKey());
 		
-		modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE, startDateElement.getDate());
-		modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE, endDateElement.getDate());
+		switch (showResultsDateDependentEl.getSelectedKey()) {
+		case "no":
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS:
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE);
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT:
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
+			
+			modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE, failedStartDateElement.getDate());
+			modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE, failedEndDateElement.getDate());
+			modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE, passedStartDateElement.getDate());
+			modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE, passedEndDateElement.getDate());
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY:
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_START_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_END_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE);
+			
+			modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE, failedStartDateElement.getDate());
+			modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE, failedEndDateElement.getDate());
+			break;
+		case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME:
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE);
+			modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE);
+			
+			modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE, generalStartDateElement.getDate());
+			modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE, generalEndDateElement.getDate());
+			break;
+		default:
+			break;
+		}
 		
-		modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE, showResultsOnHomePage.isSelected(0));
+		modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE, !showResultsDateDependentEl.isSelected(0));
 		modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_RESULT_ON_FINISH, showResultsOnFinishEl.isSelected(0));
 		
-		if(showResultsOnFinishEl.isSelected(0) || showResultsOnHomePage.isSelected(0)) {
+		if(showResultsOnFinishEl.isSelected(0) || !showResultsDateDependentEl.isSelected(0)) {
 			if(assessmentResultsOnFinishEl.isAtLeastSelected(1)) {
 				String options = QTI21AssessmentResultsOptions.toString(assessmentResultsOnFinishEl.getSelectedKeys());
 				modConfig.set(IQEditController.CONFIG_KEY_SUMMARY, options);
diff --git a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties
index 7f88f2a462331e12b69ae6ab16cbadfacdccfc21..7abb79422b94cdacec8b67a546404626f5596e95 100644
--- a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties
@@ -39,6 +39,11 @@ correction.mode.help=Bei einer Auto Korrektur wird das Resultat sofort angezeigt
 correction.test.title=Korrigieren
 correcttest=Test korrigieren
 coursefolder=Ablageordner Kurs "{0}"
+date.different=Verschiedene Daten für nicht bestanden und bestanden
+date.false=Immer
+date.failedOnly=Nur nicht bestanden
+date.no=Nein
+date.true=Wenn nicht bestanden oder bestanden
 digital.signature=Testquittung erstellen
 digital.signature.mail=Testquittung per Mail schicken
 digital.signature.mail.subject=Test-Quittung
@@ -109,10 +114,12 @@ qti.form.auto.enumerate.choices=Nummerierung der Antworten in Buchstaben anstell
 qti.form.auto.memofield=Pers\u00F6nliche Notizen
 qti.form.auto.memofield.text=Hier k\u00F6nnen Sie pers\u00F6nliche Notizen zur Frage anf\u00FCgen, welche nach Beendigung des Tests NICHT gespeichert werden.
 qti.form.block.afterSuccess=Erster bestandener L\u00F6sungsversuch z\u00E4hlt
-qti.form.date.end=bis
+qti.form.date.end=Bis
 qti.form.date.error.endbeforebegin=Das Anfangsdatum muss vor dem Enddatum liegen.
 qti.form.date.error.format=Falsches Datumsformat
-qti.form.date.start=von
+qti.form.date.failed.start=Falls <font color="red">durchgefallen</font>
+qti.form.date.passed.start=Falls <font color="green">bestanden</font>
+qti.form.date.start=Von
 qti.form.date.start.error.mandatory=Es muss mindestens ein Anfangsdatum angegeben werden. 
 qti.form.enablecancel=Abbrechen erlauben
 qti.form.enablesuspend=Unterbrechen erlauben
@@ -189,6 +196,7 @@ showResults.detailed=Resultate
 showResults.title=Resultate
 showResults.visibility=Die Resultate werden von "{0}" bis "{1}" angezeigt.
 showResults.visibility.future=Die Resultate werden angezeigt sobald die Korrektur abgeschlossen ist.
+showResults.visibility.past=Der Zeitraum zur Einsicht der Resultate ist vorbei.
 start=Start
 table.header.lastModified=Last modified
 table.header.results=Resultaten
diff --git a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties
index cbfc8969546aa541fa28b56f464eeb4ffcc000a2..367c8c6df8854b7c9f489620065a108a8b09fa0d 100644
--- a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties
@@ -39,6 +39,11 @@ correction.mode.help=For Auto correction the result is shown immediately. For Ma
 correction.test.title=Grade
 correcttest=Correct test
 coursefolder=Storage folder of course "{0}"
+date.different=Different date for failed and passed
+date.false=Always
+date.failedOnly=Only when failed
+date.no=No
+date.true=When failed or passed
 digital.signature=Test receipt
 digital.signature.download=Test receipt
 digital.signature.download.date=( Issued the {0} )
@@ -110,10 +115,12 @@ qti.form.auto.enumerate.choices=Sort answers alphabetically
 qti.form.auto.memofield=Personal notes
 qti.form.auto.memofield.text=Here you can add personal notes to a question, however, after taking your test these notes will NOT be saved.
 qti.form.block.afterSuccess=First successful attempt counts
-qti.form.date.end=until
+qti.form.date.end=Until
 qti.form.date.error.endbeforebegin=Your starting date has to be set before the ending date.
 qti.form.date.error.format=Wrong date format
-qti.form.date.start=from
+qti.form.date.failed.start=When failed
+qti.form.date.passed.start=When passed
+qti.form.date.start=From
 qti.form.date.start.error.mandatory=At least a starting date must be indicated.
 qti.form.enablecancel=Allow to cancel
 qti.form.enablesuspend=Allow to suspend
@@ -190,6 +197,7 @@ showResults.detailed=Results
 showResults.title=Results
 showResults.visibility=Your results will be displayed from "{0}" until "{1}"
 showResults.visibility.future=Your results will be displayed here as soon as the correction has been completed.
+showResults.visibility.past=The period for viewing the results is over.
 start=Start
 table.header.end.date=End date
 table.header.extra.time=Extra
diff --git a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
index a7ec4d5651cffe415fe8687976acd780aa505148..6e5519d9a6f4bdb94777cd6b0b628afbeba22585 100644
--- a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
@@ -2231,10 +2231,14 @@ public class CourseElementWebService extends AbstractCourseNodeWebService {
 		config.setShowQuestionTitle(showQuestionTitle == null ? true : showQuestionTitle);
 		Boolean showResFinish = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_RESULT_ON_FINISH);
 		config.setShowResultsAfterFinish(showResFinish == null ? true : showResFinish);
-		Boolean showResDate = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS);
-		config.setShowResultsDependendOnDate(showResDate == null ? false : showResDate);
+		String showResDate = (String)moduleConfig.get(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS);
+		config.setShowResultsDependendOnDate(showResDate == null ? IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS : showResDate);
 		config.setShowResultsStartDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE));
 		config.setShowResultsEndDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_END_DATE));
+		config.setShowResultsPassedStartDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE));
+		config.setShowResultsPassedEndDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE));
+		config.setShowResultsFailedStartDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE));
+		config.setShowResultsFailedEndDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE));
 		Boolean showResHomepage = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE);
 		config.setShowResultsOnHomepage(showResHomepage == null ? false : showResHomepage);
 		Boolean showScoreInfo = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_ENABLESCOREINFO);
@@ -2606,7 +2610,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService {
 			if(startDate != null && endDate != null) {
 				moduleConfig.set(IQEditController.CONFIG_KEY_RESULTS_START_DATE, new Date(startDate));
 				moduleConfig.set(IQEditController.CONFIG_KEY_RESULTS_END_DATE, new Date(endDate));
-			}
+			} 
 			if(showResultsOnHomepage != null) moduleConfig.set(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE, showResultsOnHomepage);
 			if(showScoreInfo != null) moduleConfig.set(IQEditController.CONFIG_KEY_ENABLESCOREINFO, showScoreInfo);
 			if(showQuestionProgress != null) moduleConfig.set(IQEditController.CONFIG_KEY_QUESTIONPROGRESS, showQuestionProgress);
diff --git a/src/main/java/org/olat/restapi/support/vo/elements/TestConfigVO.java b/src/main/java/org/olat/restapi/support/vo/elements/TestConfigVO.java
index f8654967dc76b69d1ae512e0085b13a36e31f6d9..171a471b61ac31ccfa01b49093f9391f6cc6e118 100644
--- a/src/main/java/org/olat/restapi/support/vo/elements/TestConfigVO.java
+++ b/src/main/java/org/olat/restapi/support/vo/elements/TestConfigVO.java
@@ -57,9 +57,13 @@ public class TestConfigVO {
 	private Boolean showScoreInfo;
 	private Boolean showResultsAfterFinish;
 	private Boolean showResultsOnHomepage;
-	private Boolean showResultsDependendOnDate;
+	private String showResultsDependendOnDate;
 	private Date showResultsStartDate;
 	private Date showResultsEndDate;
+	private Date showResultsFailedStartDate;
+	private Date showResultsFailedEndDate;
+	private Date showResultsPassedStartDate;
+	private Date showResultsPassedEndDate;
 
 	public TestConfigVO() {
 		//make JAXB happy
@@ -177,11 +181,11 @@ public class TestConfigVO {
 		this.showResultsOnHomepage = showResultsOnHomepage;
 	}
 
-	public Boolean getShowResultsDependendOnDate() {
+	public String getShowResultsDependendOnDate() {
 		return showResultsDependendOnDate;
 	}
 
-	public void setShowResultsDependendOnDate(Boolean showResultsDependendOnDate) {
+	public void setShowResultsDependendOnDate(String showResultsDependendOnDate) {
 		this.showResultsDependendOnDate = showResultsDependendOnDate;
 	}
 
@@ -200,4 +204,36 @@ public class TestConfigVO {
 	public void setShowResultsEndDate(Date showResultsEndDate) {
 		this.showResultsEndDate = showResultsEndDate;
 	}
+
+	public Date getShowResultsFailedStartDate() {
+		return showResultsFailedStartDate;
+	}
+
+	public void setShowResultsFailedStartDate(Date showResultsFailedStartDate) {
+		this.showResultsFailedStartDate = showResultsFailedStartDate;
+	}
+
+	public Date getShowResultsFailedEndDate() {
+		return showResultsFailedEndDate;
+	}
+
+	public void setShowResultsFailedEndDate(Date showResultsFailedEndDate) {
+		this.showResultsFailedEndDate = showResultsFailedEndDate;
+	}
+
+	public Date getShowResultsPassedStartDate() {
+		return showResultsPassedStartDate;
+	}
+
+	public void setShowResultsPassedStartDate(Date showResultsPassedStartDate) {
+		this.showResultsPassedStartDate = showResultsPassedStartDate;
+	}
+
+	public Date getShowResultsPassedEndDate() {
+		return showResultsPassedEndDate;
+	}
+
+	public void setShowResultsPassedEndDate(Date showResultsPassedEndDate) {
+		this.showResultsPassedEndDate = showResultsPassedEndDate;
+	}
 }