From 9a611c29812d3a2d90f7e60bd4371ee695f60bb4 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Tue, 21 Jan 2020 09:21:34 +0100
Subject: [PATCH] OO-4481: Overview of course element configuration of learning
 path attributes

---
 .../course/editor/EditorMainController.java   |   1 -
 .../editor/overview/OverviewDataModel.java    |  10 +-
 .../overview/OverviewListController.java      |  78 ++++++-
 .../course/editor/overview/OverviewRow.java   |  38 ++++
 .../learningpath/FullyAssessedTrigger.java    |  37 ++++
 .../learningpath/LearningPathConfigs.java     |   6 +
 .../learningpath/LearningPathEditConfigs.java |  51 +++++
 .../LearningPathEditConfigsBuilder.java       | 152 +++++++++++++
 .../learningpath/LearningPathNodeHandler.java |   4 +-
 .../learningpath/LearningPathService.java     |   2 +
 .../LearningPathTranslations.java             |  44 ++++
 .../LearningPathTranslationsBuilder.java      | 117 ++++++++++
 .../manager/LearningPathServiceImpl.java      |   6 +
 .../UnsupportedLearningPathNodeHandler.java   |   6 +
 .../model/ModuleLearningPathConfigs.java      |  32 ++-
 .../model/UnsupportedLearningPathConfigs.java |  11 +
 .../ui/LearningPathNodeConfigController.java  | 207 +++---------------
 .../learningpath/ui/TranslateableBoolean.java |  65 ------
 .../ui/_i18n/LocalStrings_de.properties       |   2 +
 .../ui/_i18n/LocalStrings_en.properties       |   2 +
 .../nodes/bc/BCLearningPathNodeHandler.java   |  18 +-
 .../Card2BrainLearningPathNodeHandler.java    |  18 +-
 .../nodes/cl/CLLearningPathNodeHandler.java   |  30 ++-
 .../EdubaseLearningPathNodeHandler.java       |  18 +-
 .../nodes/en/ENLearningPathNodeHandler.java   |  26 ++-
 .../feed/FeedLearningPathNodeHandler.java     |  18 +-
 .../nodes/fo/FOLearningPathNodeHandler.java   |  18 +-
 .../AbstractGTALearningPathNodeHandler.java   |  26 ++-
 .../iq/IQSELFLearningPathNodeHandler.java     |  18 +-
 .../iq/IQTESTLearningPathNodeHandler.java     |  30 ++-
 .../LiveStreamLearningPathNodeHandler.java    |  18 +-
 .../nodes/ms/MSLearningPathNodeHandler.java   |  32 +--
 .../scorm/ScormLearningPathNodeHandler.java   |  22 +-
 .../nodes/sp/SPLearningPathNodeHandler.java   |  18 +-
 .../st/assessment/STLearningPathConfigs.java  |  11 +
 .../assessment/STLearningPathNodeHandler.java |   6 +
 .../survey/SurveyLearningPathNodeHandler.java |  26 ++-
 .../nodes/tu/TULearningPathNodeHandler.java   |  18 +-
 .../video/VideoLearningPathNodeHandler.java   |  19 +-
 39 files changed, 870 insertions(+), 391 deletions(-)
 create mode 100644 src/main/java/org/olat/course/learningpath/FullyAssessedTrigger.java
 create mode 100644 src/main/java/org/olat/course/learningpath/LearningPathEditConfigs.java
 create mode 100644 src/main/java/org/olat/course/learningpath/LearningPathEditConfigsBuilder.java
 create mode 100644 src/main/java/org/olat/course/learningpath/LearningPathTranslations.java
 create mode 100644 src/main/java/org/olat/course/learningpath/LearningPathTranslationsBuilder.java
 delete mode 100644 src/main/java/org/olat/course/learningpath/ui/TranslateableBoolean.java

diff --git a/src/main/java/org/olat/course/editor/EditorMainController.java b/src/main/java/org/olat/course/editor/EditorMainController.java
index a829393b694..57eab981ec2 100644
--- a/src/main/java/org/olat/course/editor/EditorMainController.java
+++ b/src/main/java/org/olat/course/editor/EditorMainController.java
@@ -1157,7 +1157,6 @@ public class EditorMainController extends MainLayoutBasicController implements G
 	private void launchPreview(UserRequest ureq, ICourse course) {
 		removeAsListenerAndDispose(previewController);
 		
-		//TODO uh do it like in preview
 		previewController = new PreviewConfigController(ureq, getWindowControl(), course);
 		listenTo(previewController);
 		stackPanel.pushController(translate("command.coursepreview"), previewController);
diff --git a/src/main/java/org/olat/course/editor/overview/OverviewDataModel.java b/src/main/java/org/olat/course/editor/overview/OverviewDataModel.java
index 914c364fe15..2e688390293 100644
--- a/src/main/java/org/olat/course/editor/overview/OverviewDataModel.java
+++ b/src/main/java/org/olat/course/editor/overview/OverviewDataModel.java
@@ -63,6 +63,10 @@ public class OverviewDataModel extends DefaultFlexiTreeTableDataModel<OverviewRo
 			case longTitle: return row.getCourseNode().getLongTitle();
 			case learningObjectives: return row.getCourseNode().getLearningObjectives();
 			case display: return row.getTranslatedDisplayOption();
+			case duration: return row.getDuration();
+			case obligation: return row.getTranslatedObligation();
+			case start: return row.getStart();
+			case trigger: return row.getTranslatedTrigger();
 			default: return null;
 		}
 	}
@@ -77,7 +81,11 @@ public class OverviewDataModel extends DefaultFlexiTreeTableDataModel<OverviewRo
 		shortTitle("table.header.short.title"),
 		longTitle("table.header.long.title"),
 		learningObjectives("table.header.learning.objectives"),
-		display("table.header.display");
+		display("table.header.display"),
+		duration("table.header.duration"),
+		obligation("table.header.obligation"),
+		start("table.header.start"),
+		trigger("table.header.trigger");
 		
 		private final String i18nKey;
 		
diff --git a/src/main/java/org/olat/course/editor/overview/OverviewListController.java b/src/main/java/org/olat/course/editor/overview/OverviewListController.java
index 1f47e5f9ac6..ae4f3e75263 100644
--- a/src/main/java/org/olat/course/editor/overview/OverviewListController.java
+++ b/src/main/java/org/olat/course/editor/overview/OverviewListController.java
@@ -42,8 +42,17 @@ import org.olat.course.ICourse;
 import org.olat.course.assessment.IndentedNodeRenderer;
 import org.olat.course.editor.EditorMainController;
 import org.olat.course.editor.overview.OverviewDataModel.OverviewCols;
+import org.olat.course.learningpath.FullyAssessedTrigger;
+import org.olat.course.learningpath.LearningPathConfigs;
+import org.olat.course.learningpath.LearningPathService;
+import org.olat.course.learningpath.LearningPathTranslations;
+import org.olat.course.learningpath.manager.LearningPathNodeAccessProvider;
+import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
+import org.olat.course.nodeaccess.NodeAccessType;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.tree.CourseEditorTreeNode;
+import org.olat.modules.assessment.model.AssessmentObligation;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -57,11 +66,17 @@ public class OverviewListController extends FormBasicController {
 	private OverviewDataModel dataModel;
 
 	private final ICourse course;
+	private final boolean learningPath;
+	
+	@Autowired
+	private LearningPathService learningPathService;
 
 	public OverviewListController(UserRequest ureq, WindowControl wControl, ICourse course) {
 		super(ureq, wControl, LAYOUT_BAREBONE);
 		setTranslator(Util.createPackageTranslator(EditorMainController.class, getLocale(), getTranslator()));
+		setTranslator(Util.createPackageTranslator(LearningPathNodeConfigController.class, getLocale(), getTranslator()));
 		this.course = course;
+		this.learningPath = LearningPathNodeAccessProvider.TYPE.equals(NodeAccessType.of(course).getType());
 		
 		initForm(ureq);
 	}
@@ -84,7 +99,16 @@ public class OverviewListController extends FormBasicController {
 		learningObjectivesModel.setCellRenderer(new TextFlexiCellRenderer(EscapeMode.none));
 		learningObjectivesModel.setDefaultVisible(false);
 		columnsModel.addFlexiColumnModel(learningObjectivesModel);
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OverviewCols.display));
+		DefaultFlexiColumnModel displayModel = new DefaultFlexiColumnModel(OverviewCols.display);
+		displayModel.setDefaultVisible(false);
+		columnsModel.addFlexiColumnModel(displayModel);
+		
+		if (learningPath) {
+			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OverviewCols.duration));
+			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OverviewCols.obligation));
+			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OverviewCols.start));
+			columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(OverviewCols.trigger));
+		}
 		
 		dataModel = new OverviewDataModel(columnsModel);
 		tableEl = uifactory.addTableElement(getWindowControl(), "table", dataModel, 250, false, getTranslator(), formLayout);
@@ -120,8 +144,15 @@ public class OverviewListController extends FormBasicController {
 	private OverviewRow forgeRow(CourseEditorTreeNode editorNode, int recursionLevel, OverviewRow parent) {
 		CourseNode courseNode = editorNode.getCourseNode();
 		OverviewRow row = new OverviewRow(courseNode, recursionLevel);
-		row.setTranslatedDisplayOption(getTranslatedDisplayOption(courseNode));
 		row.setParent(parent);
+		row.setTranslatedDisplayOption(getTranslatedDisplayOption(courseNode));
+		if (learningPath) {
+			LearningPathConfigs learningPathConfigs = learningPathService.getConfigs(courseNode);
+			row.setDuration(learningPathConfigs.getDuration());
+			row.setTranslatedObligation(getTranslatedObligation(learningPathConfigs));
+			row.setStart(learningPathConfigs.getStartDate());
+			row.setTranslatedTrigger(getTranslatedTrigger(courseNode, learningPathConfigs));
+		}
 		return row;
 	}
 
@@ -141,6 +172,49 @@ public class OverviewListController extends FormBasicController {
 		return null;
 	}
 
+	private String getTranslatedObligation(LearningPathConfigs learningPathConfigs) {
+		AssessmentObligation obligation = learningPathConfigs.getObligation();
+		if (obligation == null) return null;
+		
+		switch (obligation) {
+		case mandatory: return translate("config.obligation.mandatory");
+		case optional: return translate("config.obligation.optional");
+		default:
+			// nothing
+		}
+		return null;
+	}
+
+	private String getTranslatedTrigger(CourseNode courseNode, LearningPathConfigs learningPathConfigs) {
+		FullyAssessedTrigger trigger = learningPathConfigs.getFullyAssessedTrigger();
+		if (trigger == null) return null;
+		
+		switch (trigger) {
+		case nodeVisited: return translate("config.trigger.visited");
+		case confirmed: return translate("config.trigger.confirmed");
+		case score: {
+			Integer scoreTriggerValue = learningPathConfigs.getScoreTriggerValue();
+			return translate("config.trigger.score.value", new String[] { scoreTriggerValue.toString() } );
+		}
+		case passed: return translate("config.trigger.passed");
+		case statusInReview: {
+			LearningPathTranslations translations = learningPathService.getEditConfigs(courseNode).getTranslations();
+			return translations.getTriggerStatusInReview(getLocale()) != null
+					? translations.getTriggerStatusInReview(getLocale())
+					: translate("config.trigger.status.in.review");
+		}
+		case statusDone: {
+			LearningPathTranslations translations = learningPathService.getEditConfigs(courseNode).getTranslations();
+			return translations.getTriggerStatusDone(getLocale()) != null
+					? translations.getTriggerStatusDone(getLocale())
+					: translate("config.trigger.status.done");
+		}
+		default:
+			// nothing
+		}
+		return null;
+	}
+	
 	@Override
 	protected void formOK(UserRequest ureq) {
 		//
diff --git a/src/main/java/org/olat/course/editor/overview/OverviewRow.java b/src/main/java/org/olat/course/editor/overview/OverviewRow.java
index 4c7aa47cf1c..bed69d76d55 100644
--- a/src/main/java/org/olat/course/editor/overview/OverviewRow.java
+++ b/src/main/java/org/olat/course/editor/overview/OverviewRow.java
@@ -19,6 +19,8 @@
  */
 package org.olat.course.editor.overview;
 
+import java.util.Date;
+
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTreeTableNode;
 import org.olat.course.assessment.IndentedNodeRenderer.IndentedCourseNode;
 import org.olat.course.nodes.CourseNode;
@@ -34,6 +36,10 @@ public class OverviewRow implements FlexiTreeTableNode, IndentedCourseNode {
 	private final CourseNode courseNode;
 	private final int recursionLevel;
 	private String translatedDisplayOption;
+	private Integer duration;
+	private String translatedObligation;
+	private Date start;
+	private String translatedTrigger;
 	private OverviewRow parent;
 	private boolean hasChildren;
 	
@@ -74,6 +80,38 @@ public class OverviewRow implements FlexiTreeTableNode, IndentedCourseNode {
 		this.translatedDisplayOption = translatedDisplayOption;
 	}
 
+	public Integer getDuration() {
+		return duration;
+	}
+
+	public void setDuration(Integer duration) {
+		this.duration = duration;
+	}
+
+	public String getTranslatedObligation() {
+		return translatedObligation;
+	}
+
+	public void setTranslatedObligation(String translatedObligation) {
+		this.translatedObligation = translatedObligation;
+	}
+
+	public Date getStart() {
+		return start;
+	}
+
+	public void setStart(Date start) {
+		this.start = start;
+	}
+
+	public String getTranslatedTrigger() {
+		return translatedTrigger;
+	}
+
+	public void setTranslatedTrigger(String translatedTrigger) {
+		this.translatedTrigger = translatedTrigger;
+	}
+
 	@Override
 	public String getCrump() {
 		return null;
diff --git a/src/main/java/org/olat/course/learningpath/FullyAssessedTrigger.java b/src/main/java/org/olat/course/learningpath/FullyAssessedTrigger.java
new file mode 100644
index 00000000000..83f1cc778ce
--- /dev/null
+++ b/src/main/java/org/olat/course/learningpath/FullyAssessedTrigger.java
@@ -0,0 +1,37 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.course.learningpath;
+
+/**
+ * 
+ * Initial date: 20 Jan 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public enum FullyAssessedTrigger {
+	
+	nodeVisited,
+	confirmed,
+	statusDone,
+	statusInReview,
+	score,
+	passed;
+
+}
diff --git a/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java b/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java
index 7b549dff853..01834f2af4e 100644
--- a/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java
+++ b/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java
@@ -25,6 +25,8 @@ import org.olat.modules.assessment.model.AssessmentEntryStatus;
 import org.olat.modules.assessment.model.AssessmentObligation;
 
 /**
+ * 
+ * Configuration of a single course node.
  * 
  * Initial date: 30 Aug 2019<br>
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
@@ -40,6 +42,10 @@ public interface LearningPathConfigs {
 	
 	public Date getStartDate();
 	
+	public FullyAssessedTrigger getFullyAssessedTrigger();
+	
+	public Integer getScoreTriggerValue();
+	
 	public FullyAssessedResult isFullyAssessedOnNodeVisited();
 	
 	public FullyAssessedResult isFullyAssessedOnConfirmation(boolean confirmed);
diff --git a/src/main/java/org/olat/course/learningpath/LearningPathEditConfigs.java b/src/main/java/org/olat/course/learningpath/LearningPathEditConfigs.java
new file mode 100644
index 00000000000..c16b19b87ea
--- /dev/null
+++ b/src/main/java/org/olat/course/learningpath/LearningPathEditConfigs.java
@@ -0,0 +1,51 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.course.learningpath;
+
+/**
+ * Configuration how a type of course node can be configured.
+ * 
+ * Initial date: 20 Jan 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public interface LearningPathEditConfigs {
+	
+	public boolean isObligationVisible();
+	
+	public boolean isTriggerNodeVisited();
+	
+	public boolean isTriggerConfirmed();
+	
+	public boolean isTriggerScore();
+	
+	public boolean isTriggerPassed();
+	
+	public boolean isTriggerStatusInReview();
+	
+	public boolean isTriggerStatusDone();
+	
+	public LearningPathTranslations getTranslations();
+	
+	public static LearningPathEditConfigsBuilder builder() {
+		return new LearningPathEditConfigsBuilder();
+	}
+
+}
diff --git a/src/main/java/org/olat/course/learningpath/LearningPathEditConfigsBuilder.java b/src/main/java/org/olat/course/learningpath/LearningPathEditConfigsBuilder.java
new file mode 100644
index 00000000000..1f27a23a760
--- /dev/null
+++ b/src/main/java/org/olat/course/learningpath/LearningPathEditConfigsBuilder.java
@@ -0,0 +1,152 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.course.learningpath;
+
+/**
+ * 
+ * Initial date: 20 Jan 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class LearningPathEditConfigsBuilder {
+	
+	private boolean obligationVisible = true;
+	private boolean triggerNodeVisited;
+	private boolean triggerConfirmed;
+	private boolean triggerScore;
+	private boolean triggerPassed;
+	private boolean triggerStatusInReview;
+	private boolean triggerStatusDone;
+	private LearningPathTranslationsBuilder translationsBuilder;
+	
+	LearningPathEditConfigsBuilder() {
+		this.translationsBuilder = new LearningPathTranslationsBuilder(this);
+	}
+
+	public LearningPathEditConfigsBuilder disableObligation() {
+		obligationVisible = false;
+		return this;
+	}
+	
+	public LearningPathEditConfigsBuilder enableNodeVisited() {
+		triggerNodeVisited = true;
+		return this;
+	}
+	
+	public LearningPathEditConfigsBuilder enableConfirmed() {
+		triggerConfirmed = true;
+		return this;
+	}
+	
+	public LearningPathEditConfigsBuilder enableScore() {
+		triggerScore = true;
+		return this;
+	}
+	
+	public LearningPathEditConfigsBuilder enablePassed() {
+		triggerPassed = true;
+		return this;
+	}
+	
+	public LearningPathEditConfigsBuilder enableStatusInReview() {
+		triggerStatusInReview = true;
+		return this;
+	}
+	
+	public LearningPathEditConfigsBuilder enableStatusDone() {
+		triggerStatusDone = true;
+		return this;
+	}
+	
+	public LearningPathTranslationsBuilder withTranslations(Class<?> translatorBaseClass) {
+		this.translationsBuilder = LearningPathTranslations.builder(this)
+				.withTranslatorBaseClass(translatorBaseClass);
+		return this.translationsBuilder;
+	}
+	
+	public LearningPathEditConfigs build() {
+		return new LearningPathEditConfigsImpl(this);
+	}
+	
+	private final static class LearningPathEditConfigsImpl implements LearningPathEditConfigs {
+		
+		private final boolean obligationVisible;
+		private final boolean triggerNodeVisited;
+		private final boolean triggerConfirmed;
+		private final boolean triggerScore;
+		private final boolean triggerPassed;
+		private final boolean triggerStatusInReview;
+		private final boolean triggerStatusDone;
+		private final LearningPathTranslations translations;
+
+		private LearningPathEditConfigsImpl(LearningPathEditConfigsBuilder builder) {
+			this.obligationVisible = builder.obligationVisible;
+			this.triggerNodeVisited = builder.triggerNodeVisited;
+			this.triggerConfirmed = builder.triggerConfirmed;
+			this.triggerScore = builder.triggerScore;
+			this.triggerPassed = builder.triggerPassed;
+			this.triggerStatusInReview = builder.triggerStatusInReview;
+			this.triggerStatusDone = builder.triggerStatusDone;
+			this.translations = builder.translationsBuilder.build();
+		}
+
+		@Override
+		public boolean isObligationVisible() {
+			return obligationVisible;
+		}
+
+		@Override
+		public boolean isTriggerNodeVisited() {
+			return triggerNodeVisited;
+		}
+
+		@Override
+		public boolean isTriggerConfirmed() {
+			return triggerConfirmed;
+		}
+
+		@Override
+		public boolean isTriggerScore() {
+			return triggerScore;
+		}
+
+		@Override
+		public boolean isTriggerPassed() {
+			return triggerPassed;
+		}
+
+		@Override
+		public boolean isTriggerStatusInReview() {
+			return triggerStatusInReview;
+		}
+
+		@Override
+		public boolean isTriggerStatusDone() {
+			return triggerStatusDone;
+		}
+
+		@Override
+		public LearningPathTranslations getTranslations() {
+			return translations;
+		}
+		
+	}
+
+}
diff --git a/src/main/java/org/olat/course/learningpath/LearningPathNodeHandler.java b/src/main/java/org/olat/course/learningpath/LearningPathNodeHandler.java
index 6dc229ed963..f3f1037328f 100644
--- a/src/main/java/org/olat/course/learningpath/LearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/learningpath/LearningPathNodeHandler.java
@@ -40,7 +40,9 @@ public interface LearningPathNodeHandler extends CourseNodeProvider {
 	
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode);
-
+	
+	public LearningPathEditConfigs getEditConfigs();
+	
 	public void onMigrated(CourseNode courseNode);
 
 }
diff --git a/src/main/java/org/olat/course/learningpath/LearningPathService.java b/src/main/java/org/olat/course/learningpath/LearningPathService.java
index 077a7ebfb5b..ecddf214ee6 100644
--- a/src/main/java/org/olat/course/learningpath/LearningPathService.java
+++ b/src/main/java/org/olat/course/learningpath/LearningPathService.java
@@ -35,6 +35,8 @@ import org.olat.repository.RepositoryEntry;
 public interface LearningPathService {
 
 	public LearningPathConfigs getConfigs(CourseNode courseNode);
+	
+	public LearningPathEditConfigs getEditConfigs(CourseNode courseNode);
 
 	public List<CourseNode> getUnsupportedCourseNodes(ICourse course);
 
diff --git a/src/main/java/org/olat/course/learningpath/LearningPathTranslations.java b/src/main/java/org/olat/course/learningpath/LearningPathTranslations.java
new file mode 100644
index 00000000000..77272899a59
--- /dev/null
+++ b/src/main/java/org/olat/course/learningpath/LearningPathTranslations.java
@@ -0,0 +1,44 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.course.learningpath;
+
+import java.util.Locale;
+
+/**
+ * 
+ * Initial date: 19 Jan 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public interface LearningPathTranslations {
+
+	public String getTriggerStatusInReview(Locale locale);
+	
+	public String getTriggerStatusDone(Locale locale);
+	
+	public static LearningPathTranslations untranslated() {
+		return LearningPathTranslationsBuilder.UNTRANSLATED;
+	}
+	
+	public static LearningPathTranslationsBuilder builder(LearningPathEditConfigsBuilder editConfigsBuilder) {
+		return new LearningPathTranslationsBuilder(editConfigsBuilder);
+	}
+	
+}
diff --git a/src/main/java/org/olat/course/learningpath/LearningPathTranslationsBuilder.java b/src/main/java/org/olat/course/learningpath/LearningPathTranslationsBuilder.java
new file mode 100644
index 00000000000..b40a4ddd4ee
--- /dev/null
+++ b/src/main/java/org/olat/course/learningpath/LearningPathTranslationsBuilder.java
@@ -0,0 +1,117 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.course.learningpath;
+
+import java.util.Locale;
+
+import org.olat.core.gui.translator.Translator;
+import org.olat.core.util.StringHelper;
+import org.olat.core.util.Util;
+
+/**
+ * 
+ * Initial date: 20 Jan 2020<br>
+ * 
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class LearningPathTranslationsBuilder {
+
+	static final LearningPathTranslations UNTRANSLATED = new Untranslated();
+
+	private final LearningPathEditConfigsBuilder editConfigsBuilder;
+	private Class<?> translatorBaseClass;
+	private String triggerStatusInReviewKey;
+	private String triggerStatusDoneKey;
+
+	LearningPathTranslationsBuilder(LearningPathEditConfigsBuilder editConfigsBuilder) {
+		this.editConfigsBuilder = editConfigsBuilder;
+	}
+	
+	public LearningPathTranslationsBuilder withTranslatorBaseClass(Class<?> baseClass) {
+		this.translatorBaseClass = baseClass;
+		return this;
+	}
+
+	public LearningPathTranslationsBuilder withTriggerStatusInReview(String i18nKey) {
+		this.triggerStatusInReviewKey = i18nKey;
+		return this;
+	}
+
+	public LearningPathTranslationsBuilder withTriggerStatusDone(String i18nKey) {
+		this.triggerStatusDoneKey = i18nKey;
+		return this;
+	}
+	
+	public LearningPathEditConfigsBuilder buildTranslations() {
+		return editConfigsBuilder;
+	}
+
+	LearningPathTranslations build() {
+		return translatorBaseClass != null
+				? new LearningPathTranslationsImpl(this)
+				: UNTRANSLATED;
+	}
+
+	private static final class LearningPathTranslationsImpl implements LearningPathTranslations {
+
+		private final Class<?> translatorBaseClass;
+		private final String triggerStatusInReviewKey;
+		private final String triggerStatusDoneKey;
+		
+		private LearningPathTranslationsImpl(LearningPathTranslationsBuilder builder) {
+			this.translatorBaseClass = builder.translatorBaseClass;
+			this.triggerStatusInReviewKey = builder.triggerStatusInReviewKey;
+			this.triggerStatusDoneKey = builder.triggerStatusDoneKey;
+		}
+
+		@Override
+		public String getTriggerStatusInReview(Locale locale) {
+			return StringHelper.containsNonWhitespace(triggerStatusInReviewKey)
+					? getTranslator(locale).translate(triggerStatusInReviewKey)
+					: null;
+		}
+
+		@Override
+		public String getTriggerStatusDone(Locale locale) {
+			return StringHelper.containsNonWhitespace(triggerStatusDoneKey)
+					? getTranslator(locale).translate(triggerStatusDoneKey)
+					: null;
+		}
+
+		private Translator getTranslator(Locale locale) {
+			return Util.createPackageTranslator(translatorBaseClass, locale);
+		}
+	}
+	
+	private static final class Untranslated implements LearningPathTranslations {
+
+		@Override
+		public String getTriggerStatusInReview(Locale locale) {
+			return null;
+		}
+
+		@Override
+		public String getTriggerStatusDone(Locale locale) {
+			return null;
+		}
+		
+	}
+}
diff --git a/src/main/java/org/olat/course/learningpath/manager/LearningPathServiceImpl.java b/src/main/java/org/olat/course/learningpath/manager/LearningPathServiceImpl.java
index 3572e1437e2..fa2f7d70c95 100644
--- a/src/main/java/org/olat/course/learningpath/manager/LearningPathServiceImpl.java
+++ b/src/main/java/org/olat/course/learningpath/manager/LearningPathServiceImpl.java
@@ -26,6 +26,7 @@ import org.olat.core.util.tree.TreeVisitor;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.learningpath.LearningPathConfigs;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.LearningPathService;
 import org.olat.course.nodes.CollectingVisitor;
 import org.olat.course.nodes.CourseNode;
@@ -54,6 +55,11 @@ public class LearningPathServiceImpl implements LearningPathService {
 		return registry.getLearningPathNodeHandler(courseNode).getConfigs(courseNode);
 	}
 
+	@Override
+	public LearningPathEditConfigs getEditConfigs(CourseNode courseNode) {
+		return registry.getLearningPathNodeHandler(courseNode).getEditConfigs();
+	}
+
 	@Override
 	public List<CourseNode> getUnsupportedCourseNodes(ICourse course) {
 		CourseEditorTreeModel editorTreeModel = course.getEditorTreeModel();
diff --git a/src/main/java/org/olat/course/learningpath/manager/UnsupportedLearningPathNodeHandler.java b/src/main/java/org/olat/course/learningpath/manager/UnsupportedLearningPathNodeHandler.java
index 1ef4c0df107..6c89510f7ef 100644
--- a/src/main/java/org/olat/course/learningpath/manager/UnsupportedLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/learningpath/manager/UnsupportedLearningPathNodeHandler.java
@@ -24,6 +24,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.UnsupportedLearningPathConfigs;
 import org.olat.course.nodes.CourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -63,6 +64,11 @@ public class UnsupportedLearningPathNodeHandler implements LearningPathNodeHandl
 		return null;
 	}
 
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return null;
+	}
+
 	@Override
 	public void onMigrated(CourseNode courseNode) {
 		//
diff --git a/src/main/java/org/olat/course/learningpath/model/ModuleLearningPathConfigs.java b/src/main/java/org/olat/course/learningpath/model/ModuleLearningPathConfigs.java
index ac52693b728..8ba89dcaaba 100644
--- a/src/main/java/org/olat/course/learningpath/model/ModuleLearningPathConfigs.java
+++ b/src/main/java/org/olat/course/learningpath/model/ModuleLearningPathConfigs.java
@@ -36,6 +36,7 @@ import static org.olat.course.learningpath.ui.LearningPathNodeConfigController.C
 import java.util.Date;
 
 import org.olat.core.util.StringHelper;
+import org.olat.course.learningpath.FullyAssessedTrigger;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.modules.ModuleConfiguration;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
@@ -89,10 +90,27 @@ public class ModuleLearningPathConfigs implements LearningPathConfigs {
 	public Date getStartDate() {
 		return moduleConfiguration.getDateValue(CONFIG_KEY_START);
 	}
+	
+	@Override
+	public FullyAssessedTrigger getFullyAssessedTrigger() {
+		return FullyAssessedTrigger.valueOf(getFullyAssessedTriggerConfig());
+	}
+
+	private String getFullyAssessedTriggerConfig() {
+		return moduleConfiguration.getStringValue(CONFIG_KEY_TRIGGER, CONFIG_DEFAULT_TRIGGER);
+	}
+
+	@Override
+	public Integer getScoreTriggerValue() {
+		String fullyAssessedTrigger = getFullyAssessedTriggerConfig();
+		return CONFIG_VALUE_TRIGGER_SCORE.equals(fullyAssessedTrigger)
+			? toInteger(moduleConfiguration.getStringValue(CONFIG_KEY_SCORE_CUT_VALUE))
+			: null;
+	}
 
 	@Override
 	public FullyAssessedResult isFullyAssessedOnNodeVisited() {
-		String fullyAssessedTrigger = getFullyAssessedTrigger();
+		String fullyAssessedTrigger = getFullyAssessedTriggerConfig();
 		if (CONFIG_VALUE_TRIGGER_NODE_VISITED.equals(fullyAssessedTrigger)) {
 			return LearningPathConfigs.fullyAssessed(true, true, doneOnFullyAssessed);
 		}
@@ -101,7 +119,7 @@ public class ModuleLearningPathConfigs implements LearningPathConfigs {
 
 	@Override
 	public FullyAssessedResult isFullyAssessedOnConfirmation(boolean confirmed) {
-		String fullyAssessedTrigger = getFullyAssessedTrigger();
+		String fullyAssessedTrigger = getFullyAssessedTriggerConfig();
 		if (CONFIG_VALUE_TRIGGER_CONFIRMED.equals(fullyAssessedTrigger)) {
 			return LearningPathConfigs.fullyAssessed(true, confirmed, doneOnFullyAssessed);
 		}
@@ -110,7 +128,7 @@ public class ModuleLearningPathConfigs implements LearningPathConfigs {
 
 	@Override
 	public FullyAssessedResult isFullyAssessedOnScore(Float score, Boolean userVisibility) {
-		String fullyAssessedTrigger = getFullyAssessedTrigger();
+		String fullyAssessedTrigger = getFullyAssessedTriggerConfig();
 		if (CONFIG_VALUE_TRIGGER_SCORE.equals(fullyAssessedTrigger)) {
 			Integer scoreCut = toInteger(moduleConfiguration.getStringValue(CONFIG_KEY_SCORE_CUT_VALUE));
 			boolean fullyAssessed = Boolean.TRUE.equals(userVisibility) && score != null && scoreCut != null
@@ -122,7 +140,7 @@ public class ModuleLearningPathConfigs implements LearningPathConfigs {
 
 	@Override
 	public FullyAssessedResult isFullyAssessedOnPassed(Boolean passed, Boolean userVisibility) {
-		String fullyAssessedTrigger = getFullyAssessedTrigger();
+		String fullyAssessedTrigger = getFullyAssessedTriggerConfig();
 		if (CONFIG_VALUE_TRIGGER_PASSED.equals(fullyAssessedTrigger)) {
 			boolean fullyAssessed = Boolean.TRUE.equals(passed) && Boolean.TRUE.equals(userVisibility);
 			return LearningPathConfigs.fullyAssessed(true, fullyAssessed, doneOnFullyAssessed);
@@ -132,7 +150,7 @@ public class ModuleLearningPathConfigs implements LearningPathConfigs {
 
 	@Override
 	public FullyAssessedResult isFullyAssessedOnStatus(AssessmentEntryStatus status) {
-		String fullyAssessedTrigger = getFullyAssessedTrigger();
+		String fullyAssessedTrigger = getFullyAssessedTriggerConfig();
 		if (CONFIG_VALUE_TRIGGER_STATUS_DONE.equals(fullyAssessedTrigger)) {
 			boolean fullyAssessed = AssessmentEntryStatus.done.equals(status);
 			return LearningPathConfigs.fullyAssessed(true, fullyAssessed, false);
@@ -144,10 +162,6 @@ public class ModuleLearningPathConfigs implements LearningPathConfigs {
 		}
 		return LearningPathConfigs.notFullyAssessed();
 	}
-
-	private String getFullyAssessedTrigger() {
-		return moduleConfiguration.getStringValue(CONFIG_KEY_TRIGGER, CONFIG_DEFAULT_TRIGGER);
-	}
 	
 	private Integer toInteger(String value) {
 		if (StringHelper.containsNonWhitespace(value)) {
diff --git a/src/main/java/org/olat/course/learningpath/model/UnsupportedLearningPathConfigs.java b/src/main/java/org/olat/course/learningpath/model/UnsupportedLearningPathConfigs.java
index c56b07bf118..efb7451d376 100644
--- a/src/main/java/org/olat/course/learningpath/model/UnsupportedLearningPathConfigs.java
+++ b/src/main/java/org/olat/course/learningpath/model/UnsupportedLearningPathConfigs.java
@@ -21,6 +21,7 @@ package org.olat.course.learningpath.model;
 
 import java.util.Date;
 
+import org.olat.course.learningpath.FullyAssessedTrigger;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
 import org.olat.modules.assessment.model.AssessmentObligation;
@@ -52,6 +53,16 @@ public class UnsupportedLearningPathConfigs implements LearningPathConfigs {
 	public Date getStartDate() {
 		return null;
 	}
+
+	@Override
+	public FullyAssessedTrigger getFullyAssessedTrigger() {
+		return null;
+	}
+
+	@Override
+	public Integer getScoreTriggerValue() {
+		return null;
+	}
 	
 	@Override
 	public FullyAssessedResult isFullyAssessedOnNodeVisited() {
diff --git a/src/main/java/org/olat/course/learningpath/ui/LearningPathNodeConfigController.java b/src/main/java/org/olat/course/learningpath/ui/LearningPathNodeConfigController.java
index d6b7921f700..f7fe4b96a76 100644
--- a/src/main/java/org/olat/course/learningpath/ui/LearningPathNodeConfigController.java
+++ b/src/main/java/org/olat/course/learningpath/ui/LearningPathNodeConfigController.java
@@ -40,6 +40,9 @@ import org.olat.core.util.StringHelper;
 import org.olat.course.CourseFactory;
 import org.olat.course.config.CompletionType;
 import org.olat.course.config.CourseConfig;
+import org.olat.course.learningpath.FullyAssessedTrigger;
+import org.olat.course.learningpath.LearningPathEditConfigs;
+import org.olat.course.learningpath.LearningPathTranslations;
 import org.olat.modules.ModuleConfiguration;
 import org.olat.modules.assessment.model.AssessmentObligation;
 import org.olat.repository.RepositoryEntry;
@@ -57,12 +60,12 @@ public class LearningPathNodeConfigController extends FormBasicController {
 	public static final String CONFIG_DEFAULT_OBLIGATION = AssessmentObligation.mandatory.name();
 	public static final String CONFIG_KEY_START = "start.date";
 	public static final String CONFIG_KEY_TRIGGER = "fully.assessed.trigger";
-	public static final String CONFIG_VALUE_TRIGGER_NODE_VISITED = "nodeVisited";
-	public static final String CONFIG_VALUE_TRIGGER_CONFIRMED = "confirmed";
-	public static final String CONFIG_VALUE_TRIGGER_STATUS_DONE = "statusDone";
-	public static final String CONFIG_VALUE_TRIGGER_STATUS_IN_REVIEW = "statusInReview";
-	public static final String CONFIG_VALUE_TRIGGER_SCORE = "score";
-	public static final String CONFIG_VALUE_TRIGGER_PASSED = "passed";
+	public static final String CONFIG_VALUE_TRIGGER_NODE_VISITED = FullyAssessedTrigger.nodeVisited.name();
+	public static final String CONFIG_VALUE_TRIGGER_CONFIRMED = FullyAssessedTrigger.confirmed.name();
+	public static final String CONFIG_VALUE_TRIGGER_STATUS_DONE = FullyAssessedTrigger.statusDone.name();
+	public static final String CONFIG_VALUE_TRIGGER_STATUS_IN_REVIEW = FullyAssessedTrigger.statusInReview.name();
+	public static final String CONFIG_VALUE_TRIGGER_SCORE = FullyAssessedTrigger.score.name();
+	public static final String CONFIG_VALUE_TRIGGER_PASSED = FullyAssessedTrigger.passed.name();
 	public static final String CONFIG_DEFAULT_TRIGGER = CONFIG_VALUE_TRIGGER_CONFIRMED;
 	public static final String CONFIG_KEY_SCORE_CUT_VALUE = "scoreCutValue";
 	
@@ -74,14 +77,14 @@ public class LearningPathNodeConfigController extends FormBasicController {
 
 	private final CourseConfig courseConfig;
 	private final ModuleConfiguration moduleConfigs;
-	private final LearningPathControllerConfig ctrlConfig;
+	private final LearningPathEditConfigs editConfigs;
 
 	public LearningPathNodeConfigController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
-			ModuleConfiguration moduleConfig, LearningPathControllerConfig ctrlConfig) {
+			ModuleConfiguration moduleConfig, LearningPathEditConfigs editConfigs) {
 		super(ureq, wControl);
 		this.courseConfig = CourseFactory.loadCourse(courseEntry).getCourseConfig();
 		this.moduleConfigs = moduleConfig;
-		this.ctrlConfig = ctrlConfig;
+		this.editConfigs = editConfigs;
 		initForm(ureq);
 	}
 
@@ -99,7 +102,7 @@ public class LearningPathNodeConfigController extends FormBasicController {
 		if (Arrays.asList(obligationEl.getKeys()).contains(obligationKey)) {
 			obligationEl.select(obligationKey, true);
 		}
-		obligationEl.setVisible(ctrlConfig.isObligationVisible());
+		obligationEl.setVisible(editConfigs.isObligationVisible());
 		
 		Date startDate = moduleConfigs.getDateValue(CONFIG_KEY_START);
 		startDateEl = uifactory.addDateChooser("config.start.date", startDate, formLayout);
@@ -125,37 +128,36 @@ public class LearningPathNodeConfigController extends FormBasicController {
 
 	private KeyValues getTriggerKV() {
 		KeyValues triggerKV = new KeyValues();
-		if (ctrlConfig.isTriggerNodeVisited()) {
+		if (editConfigs.isTriggerNodeVisited()) {
 			triggerKV.add(entry(CONFIG_VALUE_TRIGGER_NODE_VISITED, translate("config.trigger.visited")));
 		}
-		if (ctrlConfig.isTriggerConfirmed()) {
+		if (editConfigs.isTriggerConfirmed()) {
 			triggerKV.add(entry(CONFIG_VALUE_TRIGGER_CONFIRMED, translate("config.trigger.confirmed")));
 		}
-		if (ctrlConfig.isTriggerScore()) {
+		if (editConfigs.isTriggerScore()) {
 			triggerKV.add(entry(CONFIG_VALUE_TRIGGER_SCORE, translate("config.trigger.score")));
 		}
-		if (ctrlConfig.isTriggerPassed()) {
+		if (editConfigs.isTriggerPassed()) {
 			triggerKV.add(entry(CONFIG_VALUE_TRIGGER_PASSED, translate("config.trigger.passed")));
 		}
-		TranslateableBoolean triggerStatusInReview = ctrlConfig.getTriggerStatusInReview();
-		if (triggerStatusInReview.isTrue()) {
-			triggerKV.add(entry(CONFIG_VALUE_TRIGGER_STATUS_IN_REVIEW,
-					getTranslationOrDefault(triggerStatusInReview, "config.trigger.status.in.review")));
+		
+		LearningPathTranslations translations = editConfigs.getTranslations();
+		if (editConfigs.isTriggerStatusInReview()) {
+			String translation = translations.getTriggerStatusInReview(getLocale()) != null
+					? translations.getTriggerStatusInReview(getLocale())
+					: translate("config.trigger.status.in.review");
+			triggerKV.add(entry(CONFIG_VALUE_TRIGGER_STATUS_IN_REVIEW, translation));
 		}
-		TranslateableBoolean triggerStatusDone = ctrlConfig.getTriggerStatusDone();
-		if (triggerStatusDone.isTrue()) {
-			triggerKV.add(entry(CONFIG_VALUE_TRIGGER_STATUS_DONE,
-					getTranslationOrDefault(triggerStatusDone, "config.trigger.status.done")));
+		
+		if (editConfigs.isTriggerStatusDone()) {
+			String translation = translations.getTriggerStatusDone(getLocale()) != null
+					? translations.getTriggerStatusDone(getLocale())
+					: translate("config.trigger.status.done");
+			triggerKV.add(entry(CONFIG_VALUE_TRIGGER_STATUS_DONE, translation));
 		}
 		return triggerKV;
 	}
 	
-	private String getTranslationOrDefault(TranslateableBoolean trans, String defaulI18nKey) {
-		return trans.isTranslated()
-				? trans.getMessage()
-				: translate(defaulI18nKey);
-	}
-	
 	private void updateUI() {
 		durationEl.setMandatory(isDurationMandatory());
 		
@@ -248,154 +250,5 @@ public class LearningPathNodeConfigController extends FormBasicController {
 				&& AssessmentObligation.mandatory.name().equals(obligationEl.getSelectedKey());
 	}
 	
-	public interface LearningPathControllerConfig {
-		
-		public boolean isObligationVisible();
-		
-		public boolean isTriggerNodeVisited();
-		
-		public boolean isTriggerConfirmed();
-		
-		public boolean isTriggerScore();
-		
-		public boolean isTriggerPassed();
-		
-		public TranslateableBoolean getTriggerStatusInReview();
-		
-		public TranslateableBoolean getTriggerStatusDone();
-		
-	}
-	
-	public static ControllerConfigBuilder builder() {
-		return new ControllerConfigBuilder();
-	}
-	
-	public static class ControllerConfigBuilder {
-		
-		public boolean obligationVisible = true;
-		private boolean triggerNodeVisited;
-		private boolean triggerConfirmed;
-		private boolean triggerScore;
-		private boolean triggerPassed;
-		private TranslateableBoolean triggerStatusInReview;
-		private TranslateableBoolean triggerStatusDone;
-		
-		private ControllerConfigBuilder() {
-		}
-		
-		public ControllerConfigBuilder disableObligation() {
-			obligationVisible = false;
-			return this;
-		}
-		
-		public ControllerConfigBuilder enableNodeVisited() {
-			triggerNodeVisited = true;
-			return this;
-		}
-		
-		public ControllerConfigBuilder enableConfirmed() {
-			triggerConfirmed = true;
-			return this;
-		}
-		
-		public ControllerConfigBuilder enableScore() {
-			triggerScore = true;
-			return this;
-		}
-		
-		public ControllerConfigBuilder enablePassed() {
-			triggerPassed = true;
-			return this;
-		}
-		
-		public ControllerConfigBuilder enableStatusInReview() {
-			triggerStatusInReview = TranslateableBoolean.untranslatedTrue();
-			return this;
-		}
-		
-		public ControllerConfigBuilder enableStatusInReview(String message) {
-			triggerStatusInReview = TranslateableBoolean.translatedTrue(message);
-			return this;
-		}
-		
-		public ControllerConfigBuilder enableStatusDone() {
-			triggerStatusDone = TranslateableBoolean.untranslatedTrue();
-			return this;
-		}
-		
-		public ControllerConfigBuilder enableStatusDone(String message) {
-			triggerStatusDone = TranslateableBoolean.translatedTrue(message);
-			return this;
-		}
-		
-		public LearningPathControllerConfig build() {
-			return new ControllerConfigImpl(this);
-		}
-		
-		private final static class ControllerConfigImpl implements LearningPathControllerConfig {
-			
-			public final boolean obligationVisible;
-			public final boolean triggerNodeVisited;
-			public final boolean triggerConfirmed;
-			public final boolean triggerScore;
-			public final boolean triggerPassed;
-			public final TranslateableBoolean triggerStatusInReview;
-			public final TranslateableBoolean triggerStatusDone;
-
-			public ControllerConfigImpl(ControllerConfigBuilder builder) {
-				this.obligationVisible = builder.obligationVisible;
-				this.triggerNodeVisited = builder.triggerNodeVisited;
-				this.triggerConfirmed = builder.triggerConfirmed;
-				this.triggerScore = builder.triggerScore;
-				this.triggerPassed = builder.triggerPassed;
-				this.triggerStatusInReview = falseIfNull(builder.triggerStatusInReview);
-				this.triggerStatusDone = falseIfNull(builder.triggerStatusDone);
-			}
-			
-			private TranslateableBoolean falseIfNull(TranslateableBoolean translateableBoolean) {
-				return translateableBoolean != null
-						? translateableBoolean
-						: TranslateableBoolean.untranslatedFalse();
-			}
-
-			@Override
-			public boolean isObligationVisible() {
-				return obligationVisible;
-			}
-
-			@Override
-			public boolean isTriggerNodeVisited() {
-				return triggerNodeVisited;
-			}
-
-			@Override
-			public boolean isTriggerConfirmed() {
-				return triggerConfirmed;
-			}
-
-			@Override
-			public boolean isTriggerScore() {
-				return triggerScore;
-			}
-
-			@Override
-			public boolean isTriggerPassed() {
-				return triggerPassed;
-			}
-
-			@Override
-			public TranslateableBoolean getTriggerStatusInReview() {
-				return triggerStatusInReview;
-			}
-
-			@Override
-			public TranslateableBoolean getTriggerStatusDone() {
-				return triggerStatusDone;
-			}
-			
-		}
-		
-	}
-	
 }
 
diff --git a/src/main/java/org/olat/course/learningpath/ui/TranslateableBoolean.java b/src/main/java/org/olat/course/learningpath/ui/TranslateableBoolean.java
deleted file mode 100644
index 6de40fbe97c..00000000000
--- a/src/main/java/org/olat/course/learningpath/ui/TranslateableBoolean.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * <a href="http://www.openolat.org">
- * OpenOLAT - Online Learning and Training</a><br>
- * <p>
- * Licensed under the Apache License, Version 2.0 (the "License"); <br>
- * you may not use this file except in compliance with the License.<br>
- * You may obtain a copy of the License at the
- * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
- * <p>
- * Unless required by applicable law or agreed to in writing,<br>
- * software distributed under the License is distributed on an "AS IS" BASIS, <br>
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
- * See the License for the specific language governing permissions and <br>
- * limitations under the License.
- * <p>
- * Initial code contributed and copyrighted by<br>
- * frentix GmbH, http://www.frentix.com
- * <p>
- */
-package org.olat.course.learningpath.ui;
-
-/**
- * 
- * Initial date: 10 Sep 2019<br>
- * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
- *
- */
-public class TranslateableBoolean {
-	
-	private static final TranslateableBoolean UNTRANSLATED_TRUE = new TranslateableBoolean(true, null);
-	private static final TranslateableBoolean UNTRANSLATED_FALSE = new TranslateableBoolean(false, null);
-	
-	private final boolean bool;
-	private final String message;
-	
-	public static final TranslateableBoolean untranslatedTrue() {
-		return UNTRANSLATED_TRUE;
-	}
-	
-	public static final TranslateableBoolean untranslatedFalse() {
-		return UNTRANSLATED_FALSE;
-	}
-	
-	public static final TranslateableBoolean translatedTrue(String message) {
-		return new TranslateableBoolean(true, message);
-	}
-	
-	private TranslateableBoolean(boolean enabled, String message) {
-		this.bool = enabled;
-		this.message = message;
-	}
-
-	public boolean isTrue() {
-		return bool;
-	}
-	
-	public boolean isTranslated() {
-		return message != null;
-	}
-
-	public String getMessage() {
-		return message;
-	}
-
-}
diff --git a/src/main/java/org/olat/course/learningpath/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/learningpath/ui/_i18n/LocalStrings_de.properties
index 8fce96a64b3..020801316e6 100644
--- a/src/main/java/org/olat/course/learningpath/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/learningpath/ui/_i18n/LocalStrings_de.properties
@@ -15,6 +15,7 @@ config.trigger=Abschluss
 config.trigger.confirmed=Best\u00E4tigung durch den Benutzer
 config.trigger.passed=Bestanden
 config.trigger.score=Punkte
+config.trigger.score.value=Punkteminimum: {0}
 config.trigger.status.done=Durchf\u00FChrung erledigt
 config.trigger.status.in.review=Korrigieren
 config.trigger.visited=Kursbaustein ge\u00F6ffnet
@@ -52,4 +53,5 @@ table.header.reponame=Kurs
 table.header.score=$org.olat.modules.assessment.ui\:table.header.score
 table.header.start=Freigabedatum
 table.header.status=Status
+table.header.trigger=$\:config.trigger
 table.header.username=Benutzername
diff --git a/src/main/java/org/olat/course/learningpath/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/learningpath/ui/_i18n/LocalStrings_en.properties
index c9e5424f91b..59269da8def 100644
--- a/src/main/java/org/olat/course/learningpath/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/learningpath/ui/_i18n/LocalStrings_en.properties
@@ -15,6 +15,7 @@ config.trigger=Completion
 config.trigger.confirmed=Confirmed by user
 config.trigger.passed=Passed
 config.trigger.score=Score
+config.trigger.score.value=Minimal score: {0}
 config.trigger.status.done=Execution done
 config.trigger.status.in.review=In review
 config.trigger.visited=Course element visited
@@ -52,4 +53,5 @@ table.header.reponame=Course
 table.header.score=$org.olat.modules.assessment.ui\:table.header.score
 table.header.start=Release date
 table.header.status=Status
+table.header.trigger=$\:config.trigger
 table.header.username=User name
diff --git a/src/main/java/org/olat/course/nodes/bc/BCLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/bc/BCLearningPathNodeHandler.java
index 887ff72725f..ea3294b7c33 100644
--- a/src/main/java/org/olat/course/nodes/bc/BCLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/bc/BCLearningPathNodeHandler.java
@@ -24,9 +24,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.BCCourseNode;
 import org.olat.course.nodes.CourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -41,6 +41,11 @@ import org.springframework.stereotype.Service;
 @Service
 public class BCLearningPathNodeHandler implements LearningPathNodeHandler {
 
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.build();
+	
 	@Override
 	public String acceptCourseNodeType() {
 		return BCCourseNode.TYPE;
@@ -59,11 +64,12 @@ public class BCLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainLearningPathNodeHandler.java
index ea35b0c8386..b31efaed8c8 100644
--- a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainLearningPathNodeHandler.java
@@ -24,9 +24,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.Card2BrainCourseNode;
 import org.olat.course.nodes.CourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -41,6 +41,11 @@ import org.springframework.stereotype.Service;
 @Service
 public class Card2BrainLearningPathNodeHandler implements LearningPathNodeHandler {
 
+	private static final LearningPathEditConfigs NODE_TYPE_CONFIG= LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.build();
+	
 	@Override
 	public String acceptCourseNodeType() {
 		return Card2BrainCourseNode.TYPE;
@@ -59,11 +64,12 @@ public class Card2BrainLearningPathNodeHandler implements LearningPathNodeHandle
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), NODE_TYPE_CONFIG);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return NODE_TYPE_CONFIG;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/cl/CLLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/cl/CLLearningPathNodeHandler.java
index 47b92344f5c..685e70785b3 100644
--- a/src/main/java/org/olat/course/nodes/cl/CLLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/cl/CLLearningPathNodeHandler.java
@@ -22,13 +22,11 @@ package org.olat.course.nodes.cl;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.translator.Translator;
-import org.olat.core.util.Util;
 import org.olat.course.learningpath.LearningPathConfigs;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CheckListCourseNode;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.cl.ui.CheckListEditController;
@@ -43,6 +41,16 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class CLLearningPathNodeHandler implements LearningPathNodeHandler {
+	
+	private static final LearningPathEditConfigs EDIT_CONFIGS =LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.enableScore()
+			.enablePassed()
+			.withTranslations(CheckListEditController.class)
+				.withTriggerStatusDone("fully.assessed.trigger.status.done")
+				.buildTranslations()
+			.build();
 
 	@Override
 	public String acceptCourseNodeType() {
@@ -62,15 +70,13 @@ public class CLLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		Translator translator = Util.createPackageTranslator(CheckListEditController.class, ureq.getLocale());
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.enableScore()
-				.enablePassed()
-				.enableStatusDone(translator.translate("fully.assessed.trigger.status.done"))
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(),
+				EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/edubase/EdubaseLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/edubase/EdubaseLearningPathNodeHandler.java
index af141539b7c..f3c5b544630 100644
--- a/src/main/java/org/olat/course/nodes/edubase/EdubaseLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/edubase/EdubaseLearningPathNodeHandler.java
@@ -24,9 +24,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.EdubaseCourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -41,6 +41,11 @@ import org.springframework.stereotype.Service;
 @Service
 public class EdubaseLearningPathNodeHandler implements LearningPathNodeHandler {
 
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.build();
+	
 	@Override
 	public String acceptCourseNodeType() {
 		return EdubaseCourseNode.TYPE;
@@ -59,11 +64,12 @@ public class EdubaseLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/en/ENLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/en/ENLearningPathNodeHandler.java
index f228a354848..58e223bf3e3 100644
--- a/src/main/java/org/olat/course/nodes/en/ENLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/en/ENLearningPathNodeHandler.java
@@ -22,13 +22,11 @@ package org.olat.course.nodes.en;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.translator.Translator;
-import org.olat.core.util.Util;
 import org.olat.course.learningpath.LearningPathConfigs;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.ENCourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -42,6 +40,14 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class ENLearningPathNodeHandler implements LearningPathNodeHandler {
+	
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.withTranslations(ENEditController.class)
+				.withTriggerStatusDone("fully.assessed.trigger.status.done")
+				.buildTranslations()
+			.build();
 
 	@Override
 	public String acceptCourseNodeType() {
@@ -61,13 +67,13 @@ public class ENLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		Translator translator = Util.createPackageTranslator(ENEditController.class, ureq.getLocale());
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.enableStatusDone(translator.translate("fully.assessed.trigger.status.done"))
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(),
+				EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/feed/FeedLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/feed/FeedLearningPathNodeHandler.java
index f848d324ce8..79f9e02be27 100644
--- a/src/main/java/org/olat/course/nodes/feed/FeedLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/feed/FeedLearningPathNodeHandler.java
@@ -24,9 +24,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.AbstractFeedCourseNode;
 import org.olat.course.nodes.CourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -38,6 +38,11 @@ import org.olat.repository.RepositoryEntry;
  *
  */
 public abstract class FeedLearningPathNodeHandler implements LearningPathNodeHandler {
+	
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.build();
 
 	@Override
 	public boolean isSupported() {
@@ -51,11 +56,12 @@ public abstract class FeedLearningPathNodeHandler implements LearningPathNodeHan
 
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry, CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/fo/FOLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/fo/FOLearningPathNodeHandler.java
index 0443b8eb57d..b03db18de60 100644
--- a/src/main/java/org/olat/course/nodes/fo/FOLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/fo/FOLearningPathNodeHandler.java
@@ -24,9 +24,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.FOCourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -41,6 +41,11 @@ import org.springframework.stereotype.Service;
 @Service
 public class FOLearningPathNodeHandler implements LearningPathNodeHandler {
 
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.build();
+	
 	@Override
 	public String acceptCourseNodeType() {
 		return FOCourseNode.TYPE;
@@ -59,11 +64,12 @@ public class FOLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/gta/AbstractGTALearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/gta/AbstractGTALearningPathNodeHandler.java
index 5276be1b3e4..4f6b2d22bec 100644
--- a/src/main/java/org/olat/course/nodes/gta/AbstractGTALearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/gta/AbstractGTALearningPathNodeHandler.java
@@ -24,8 +24,8 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.repository.RepositoryEntry;
 
@@ -37,6 +37,15 @@ import org.olat.repository.RepositoryEntry;
  */
 public abstract class AbstractGTALearningPathNodeHandler implements LearningPathNodeHandler {
 
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.disableObligation()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.enableScore()
+			.enablePassed()
+			.enableStatusDone()
+			.build();
+	
 	@Override
 	public boolean isSupported() {
 		return true;
@@ -50,15 +59,12 @@ public abstract class AbstractGTALearningPathNodeHandler implements LearningPath
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.disableObligation()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.enableScore()
-				.enablePassed()
-				.enableStatusDone()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/iq/IQSELFLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/iq/IQSELFLearningPathNodeHandler.java
index bacf71cfcd7..271fe044fd0 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQSELFLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQSELFLearningPathNodeHandler.java
@@ -24,9 +24,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.IQSELFCourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -41,6 +41,11 @@ import org.springframework.stereotype.Service;
 @Service
 public class IQSELFLearningPathNodeHandler implements LearningPathNodeHandler {
 
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.build();
+	
 	@Override
 	public String acceptCourseNodeType() {
 		return IQSELFCourseNode.TYPE;
@@ -59,11 +64,12 @@ public class IQSELFLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/iq/IQTESTLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/iq/IQTESTLearningPathNodeHandler.java
index 67b447fde80..d68602e9d18 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQTESTLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQTESTLearningPathNodeHandler.java
@@ -22,13 +22,11 @@ package org.olat.course.nodes.iq;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.translator.Translator;
-import org.olat.core.util.Util;
 import org.olat.course.learningpath.LearningPathConfigs;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.IQTESTCourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -42,6 +40,16 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class IQTESTLearningPathNodeHandler implements LearningPathNodeHandler {
+	
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.enableScore()
+			.enablePassed()
+			.withTranslations(IQEditController.class)
+				.withTriggerStatusDone("fully.assessed.trigger.status.in.review")
+				.buildTranslations()
+			.build();
 
 	@Override
 	public String acceptCourseNodeType() {
@@ -61,15 +69,13 @@ public class IQTESTLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		Translator translator = Util.createPackageTranslator(IQEditController.class, ureq.getLocale());
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.enableScore()
-				.enablePassed()
-				.enableStatusInReview(translator.translate("fully.assessed.trigger.status.in.review"))
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(),
+				EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/livestream/LiveStreamLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/livestream/LiveStreamLearningPathNodeHandler.java
index 984e0adfae2..f666d6b9ddc 100644
--- a/src/main/java/org/olat/course/nodes/livestream/LiveStreamLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/livestream/LiveStreamLearningPathNodeHandler.java
@@ -24,9 +24,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.LiveStreamCourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -40,6 +40,11 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class LiveStreamLearningPathNodeHandler implements LearningPathNodeHandler {
+	
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.build();
 
 	@Override
 	public String acceptCourseNodeType() {
@@ -59,11 +64,12 @@ public class LiveStreamLearningPathNodeHandler implements LearningPathNodeHandle
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/ms/MSLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/ms/MSLearningPathNodeHandler.java
index 7d6153b9147..4fac9d1784b 100644
--- a/src/main/java/org/olat/course/nodes/ms/MSLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/ms/MSLearningPathNodeHandler.java
@@ -22,13 +22,11 @@ package org.olat.course.nodes.ms;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.translator.Translator;
-import org.olat.core.util.Util;
 import org.olat.course.learningpath.LearningPathConfigs;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.MSCourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -42,7 +40,17 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class MSLearningPathNodeHandler implements LearningPathNodeHandler {
-
+	
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.enableScore()
+			.enablePassed()
+			.withTranslations(MSEditFormController.class)
+				.withTriggerStatusDone("fully.assessed.trigger.status.done")
+				.buildTranslations()
+			.build();
+	
 	@Override
 	public String acceptCourseNodeType() {
 		return MSCourseNode.TYPE;
@@ -61,15 +69,13 @@ public class MSLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		Translator translator = Util.createPackageTranslator(MSEditFormController.class, ureq.getLocale());
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.enableScore()
-				.enablePassed()
-				.enableStatusDone(translator.translate("fully.assessed.trigger.status.done"))
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(),
+				EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/scorm/ScormLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/scorm/ScormLearningPathNodeHandler.java
index c72bb77834c..0b0898dffce 100644
--- a/src/main/java/org/olat/course/nodes/scorm/ScormLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/scorm/ScormLearningPathNodeHandler.java
@@ -24,9 +24,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.ScormCourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -41,6 +41,13 @@ import org.springframework.stereotype.Service;
 @Service
 public class ScormLearningPathNodeHandler implements LearningPathNodeHandler {
 
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.enableScore()
+			.enablePassed()
+			.build();
+	
 	@Override
 	public String acceptCourseNodeType() {
 		return ScormCourseNode.TYPE;
@@ -59,13 +66,12 @@ public class ScormLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.enableScore()
-				.enablePassed()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/sp/SPLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/sp/SPLearningPathNodeHandler.java
index 31dc06b37ae..bdd73dbba8e 100644
--- a/src/main/java/org/olat/course/nodes/sp/SPLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/sp/SPLearningPathNodeHandler.java
@@ -24,9 +24,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.SPCourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -41,6 +41,11 @@ import org.springframework.stereotype.Service;
 @Service
 public class SPLearningPathNodeHandler implements LearningPathNodeHandler {
 
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.build();
+	
 	@Override
 	public String acceptCourseNodeType() {
 		return SPCourseNode.TYPE;
@@ -59,11 +64,12 @@ public class SPLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathConfigs.java b/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathConfigs.java
index f1af76e13ba..5ee6a326cce 100644
--- a/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathConfigs.java
+++ b/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathConfigs.java
@@ -21,6 +21,7 @@ package org.olat.course.nodes.st.assessment;
 
 import java.util.Date;
 
+import org.olat.course.learningpath.FullyAssessedTrigger;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
 import org.olat.modules.assessment.model.AssessmentObligation;
@@ -53,6 +54,16 @@ public class STLearningPathConfigs implements LearningPathConfigs {
 		return null;
 	}
 
+	@Override
+	public FullyAssessedTrigger getFullyAssessedTrigger() {
+		return null;
+	}
+
+	@Override
+	public Integer getScoreTriggerValue() {
+		return null;
+	}
+
 	@Override
 	public FullyAssessedResult isFullyAssessedOnNodeVisited() {
 		return LearningPathConfigs.notFullyAssessed();
diff --git a/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathNodeHandler.java
index 1ab72938360..49981441746 100644
--- a/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/st/assessment/STLearningPathNodeHandler.java
@@ -27,6 +27,7 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.ui.TabbableLeaningPathNodeConfigController;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.STCourseNode;
@@ -66,6 +67,11 @@ public class STLearningPathNodeHandler implements LearningPathNodeHandler {
 		return MessageUIFactory.createInfoMessage(ureq, wControl, null, translator.translate("no.configurations"));
 	}
 
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return null;
+	}
+
 	@Override
 	public void onMigrated(CourseNode courseNode) {
 		//
diff --git a/src/main/java/org/olat/course/nodes/survey/SurveyLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/survey/SurveyLearningPathNodeHandler.java
index e4c1967b320..13fd947a276 100644
--- a/src/main/java/org/olat/course/nodes/survey/SurveyLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/survey/SurveyLearningPathNodeHandler.java
@@ -22,13 +22,11 @@ package org.olat.course.nodes.survey;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.gui.translator.Translator;
-import org.olat.core.util.Util;
 import org.olat.course.learningpath.LearningPathConfigs;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.SurveyCourseNode;
 import org.olat.course.nodes.survey.ui.SurveyRunController;
@@ -44,6 +42,14 @@ import org.springframework.stereotype.Service;
 @Service
 public class SurveyLearningPathNodeHandler implements LearningPathNodeHandler {
 
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.withTranslations(SurveyRunController.class)
+				.withTriggerStatusDone("fully.assessed.trigger.status.done")
+				.buildTranslations()
+			.build();
+	
 	@Override
 	public String acceptCourseNodeType() {
 		return SurveyCourseNode.TYPE;
@@ -62,13 +68,13 @@ public class SurveyLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		Translator translator = Util.createPackageTranslator(SurveyRunController.class, ureq.getLocale());
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.enableStatusDone(translator.translate("fully.assessed.trigger.status.done"))
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(),
+				EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/tu/TULearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/tu/TULearningPathNodeHandler.java
index 45922f9b7f0..1554247ee29 100644
--- a/src/main/java/org/olat/course/nodes/tu/TULearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/tu/TULearningPathNodeHandler.java
@@ -24,9 +24,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.TUCourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -41,6 +41,11 @@ import org.springframework.stereotype.Service;
 @Service
 public class TULearningPathNodeHandler implements LearningPathNodeHandler {
 
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.build();
+	
 	@Override
 	public String acceptCourseNodeType() {
 		return TUCourseNode.TYPE;
@@ -59,11 +64,12 @@ public class TULearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/video/VideoLearningPathNodeHandler.java b/src/main/java/org/olat/course/nodes/video/VideoLearningPathNodeHandler.java
index 422ee66bbf0..71807943bd2 100644
--- a/src/main/java/org/olat/course/nodes/video/VideoLearningPathNodeHandler.java
+++ b/src/main/java/org/olat/course/nodes/video/VideoLearningPathNodeHandler.java
@@ -24,9 +24,9 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.course.learningpath.LearningPathConfigs;
 import org.olat.course.learningpath.LearningPathNodeHandler;
+import org.olat.course.learningpath.LearningPathEditConfigs;
 import org.olat.course.learningpath.model.ModuleLearningPathConfigs;
 import org.olat.course.learningpath.ui.LearningPathNodeConfigController;
-import org.olat.course.learningpath.ui.LearningPathNodeConfigController.LearningPathControllerConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.VideoCourseNode;
 import org.olat.repository.RepositoryEntry;
@@ -40,6 +40,11 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class VideoLearningPathNodeHandler implements LearningPathNodeHandler {
+	
+	private static final LearningPathEditConfigs EDIT_CONFIGS = LearningPathEditConfigs.builder()
+			.enableNodeVisited()
+			.enableConfirmed()
+			.build();
 
 	@Override
 	public String acceptCourseNodeType() {
@@ -59,11 +64,13 @@ public class VideoLearningPathNodeHandler implements LearningPathNodeHandler {
 	@Override
 	public Controller createConfigEditController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseEntry,
 			CourseNode courseNode) {
-		LearningPathControllerConfig ctrlConfig = LearningPathNodeConfigController.builder()
-				.enableNodeVisited()
-				.enableConfirmed()
-				.build();
-		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), ctrlConfig);
+
+		return new LearningPathNodeConfigController(ureq, wControl, courseEntry, courseNode.getModuleConfiguration(), EDIT_CONFIGS);
+	}
+
+	@Override
+	public LearningPathEditConfigs getEditConfigs() {
+		return EDIT_CONFIGS;
 	}
 
 	@Override
-- 
GitLab