diff --git a/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java b/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java
index e12c2f0602ac116281434414afb40edac898e69a..0cbd0a337e07ff63a81b46125b42d64121c57747 100644
--- a/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java
+++ b/src/main/java/de/bps/course/nodes/ChecklistCourseNode.java
@@ -45,6 +45,7 @@ import org.olat.core.util.Util;
 import org.olat.core.util.ValidationStatus;
 import org.olat.core.util.WebappHelper;
 import org.olat.core.util.ZipUtil;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.xml.XStreamHelper;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
@@ -99,7 +100,11 @@ public class ChecklistCourseNode extends AbstractAccessableCourseNode {
 	public static final String PROPERTY_CHECKLIST_KEY = CONF_CHECKLIST;
 
 	public ChecklistCourseNode() {
-		super(TYPE);
+		this(null);
+	}
+	
+	public ChecklistCourseNode(INode parent) {
+		super(TYPE, parent);
 		initDefaultConfig();
 	}
 
diff --git a/src/main/java/de/bps/course/nodes/DENCourseNode.java b/src/main/java/de/bps/course/nodes/DENCourseNode.java
index 34b76de6bf8e4324c342c695c48aa555331fa72a..fd3fc3d2c6fa09fc8b5400bcbde3a6473e2879e4 100644
--- a/src/main/java/de/bps/course/nodes/DENCourseNode.java
+++ b/src/main/java/de/bps/course/nodes/DENCourseNode.java
@@ -32,6 +32,7 @@ import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -67,7 +68,11 @@ public class DENCourseNode extends AbstractAccessableCourseNode {
 	public static final String CONF_COURSE_NODE_ID = "den_course_node_id";
 
 	public DENCourseNode() {
-		super(TYPE);
+		this(null);
+	}
+	
+	public DENCourseNode(INode parent) {
+		super(TYPE, parent);
 		initDefaultConfig();
 	}
 
diff --git a/src/main/java/de/bps/course/nodes/LLCourseNode.java b/src/main/java/de/bps/course/nodes/LLCourseNode.java
index 8a7b3fd7627bad7d46477980f217fa539be6f09a..56e84b96b4f1a1803363e33a5f6ab9949123df6c 100644
--- a/src/main/java/de/bps/course/nodes/LLCourseNode.java
+++ b/src/main/java/de/bps/course/nodes/LLCourseNode.java
@@ -29,6 +29,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.helpers.Settings;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -66,7 +67,11 @@ public class LLCourseNode extends AbstractAccessableCourseNode {
 	public static final String CONF_LINKLIST = "ll_link_list";
 
 	public LLCourseNode() {
-		super(TYPE);
+		this(null);
+	}
+
+	public LLCourseNode(INode parent) {
+		super(TYPE, parent);
 		initDefaultConfig();
 	}
 
@@ -81,7 +86,7 @@ public class LLCourseNode extends AbstractAccessableCourseNode {
 	}
 	
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if(config.getConfigurationVersion() < 2) {
 			List<LLModel> links = (List<LLModel>)config.get(CONF_LINKLIST);
@@ -103,7 +108,6 @@ public class LLCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course,
 			UserCourseEnvironment userCourseEnv) {
-		updateModuleConfigDefaults(false);
 		LLEditController childTabCntrllr = new LLEditController(getModuleConfiguration(), ureq, wControl, course);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(userCourseEnv.getCourseEditorEnv().getCurrentCourseNodeId());
 		// needed for DENEditController.isConfigValid()
@@ -120,7 +124,6 @@ public class LLCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		Controller controller = new LLRunController(ureq, wControl, getModuleConfiguration(), this, userCourseEnv, true);
 		controller = TitledWrapperHelper.getWrapper(ureq, wControl, controller, this, "o_ll_icon");
 		return new NodeRunConstructionResult(controller);
@@ -129,7 +132,6 @@ public class LLCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
 			CourseNodeSecurityCallback nodeSecCallback) {
-		updateModuleConfigDefaults(false);
 		// Use normal view as peekview
 		Controller controller = new LLRunController(ureq, wControl, getModuleConfiguration(), this, userCourseEnv, false);
 		return controller;
diff --git a/src/main/java/de/bps/course/nodes/cl/ChecklistCourseNodeConfiguration.java b/src/main/java/de/bps/course/nodes/cl/ChecklistCourseNodeConfiguration.java
index 3455c0abe64e8e8deef9f1dfc13ea95a74968aa0..0df7021fb030015f9292e3520f41b7784da85a3f 100644
--- a/src/main/java/de/bps/course/nodes/cl/ChecklistCourseNodeConfiguration.java
+++ b/src/main/java/de/bps/course/nodes/cl/ChecklistCourseNodeConfiguration.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -60,8 +61,8 @@ public class ChecklistCourseNodeConfiguration extends AbstractCourseNodeConfigur
 
 
 	@Override
-	public CourseNode getInstance() {
-		return new ChecklistCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new ChecklistCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/de/bps/course/nodes/den/DENCourseNodeConfiguration.java b/src/main/java/de/bps/course/nodes/den/DENCourseNodeConfiguration.java
index ff8bfe803ed450af96aca1e1e90b3ed96bcff3aa..e35e0530c0a85c878bf9849118daed4967aedd07 100644
--- a/src/main/java/de/bps/course/nodes/den/DENCourseNodeConfiguration.java
+++ b/src/main/java/de/bps/course/nodes/den/DENCourseNodeConfiguration.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -51,8 +52,8 @@ public class DENCourseNodeConfiguration extends AbstractCourseNodeConfiguration
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new DENCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new DENCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/de/bps/course/nodes/ll/LLCourseNodeConfiguration.java b/src/main/java/de/bps/course/nodes/ll/LLCourseNodeConfiguration.java
index 5be4c9b27a63c06000f2dfd897c712d52518158e..0e9364352b4f1d05088d83a6b13dd1606d6616f1 100644
--- a/src/main/java/de/bps/course/nodes/ll/LLCourseNodeConfiguration.java
+++ b/src/main/java/de/bps/course/nodes/ll/LLCourseNodeConfiguration.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -65,8 +66,8 @@ public class LLCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new LLCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new LLCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/de/tuchemnitz/wizard/helper/course/CourseExtensionHelper.java b/src/main/java/de/tuchemnitz/wizard/helper/course/CourseExtensionHelper.java
index 3d996ed119b01849e223068779af8eec6b54c260..94bcbab2cf462237493a558633ff0136ec8f23bd 100644
--- a/src/main/java/de/tuchemnitz/wizard/helper/course/CourseExtensionHelper.java
+++ b/src/main/java/de/tuchemnitz/wizard/helper/course/CourseExtensionHelper.java
@@ -122,16 +122,18 @@ public class CourseExtensionHelper {
 	 * @return created course node
 	 */
 	public static final CourseNode createNode(ICourse course, final String shortTitle, final String longTitle, final String type) {
+		// edit session
+		course = CourseFactory.openCourseEditSession(course.getResourceableId());
+		final CourseEditorTreeModel cetm = course.getEditorTreeModel();
+		final CourseNode rootNode = cetm.getCourseNode(course.getRunStructure().getRootNode().getIdent());
+
 		// create a node with default data
 		CourseNodeConfiguration nodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(type);
-		CourseNode node = nodeConfig.getInstance();
+		CourseNode node = nodeConfig.getInstance(cetm.getRootNode());
 		node.setShortTitle(shortTitle);
 		node.setLongTitle(longTitle);
 
 		// append node to course
-		course = CourseFactory.openCourseEditSession(course.getResourceableId());
-		final CourseEditorTreeModel cetm = course.getEditorTreeModel();
-		final CourseNode rootNode = cetm.getCourseNode(course.getRunStructure().getRootNode().getIdent());
 		course.getEditorTreeModel().addCourseNode(node, rootNode);
 		CourseFactory.saveCourseEditorTreeModel(course.getResourceableId());
 		CourseFactory.closeCourseEditSession(course.getResourceableId(), true);
diff --git a/src/main/java/org/olat/course/archiver/ArchiverMainController.java b/src/main/java/org/olat/course/archiver/ArchiverMainController.java
index a8e38f9b5f4eb401d28db98cd8f96414db7dfdd8..e5893443b5324566ecd7187f56b8bd72efac4ca9 100644
--- a/src/main/java/org/olat/course/archiver/ArchiverMainController.java
+++ b/src/main/java/org/olat/course/archiver/ArchiverMainController.java
@@ -319,7 +319,7 @@ public class ArchiverMainController extends MainLayoutBasicController {
 				contentCtr = new GenericArchiveController(ureq, getWindowControl(), ores, false, new TACourseNode());
 				main.setContent(contentCtr.getInitialComponent());
 			}  else if (menuCommand.equals(CMD_GROUPTASKS)) {
-				contentCtr = new GenericArchiveController(ureq, getWindowControl(), ores, false, new GTACourseNode(), new GTACourseNode(GTACourseNode.TYPE_INDIVIDUAL));
+				contentCtr = new GenericArchiveController(ureq, getWindowControl(), ores, false, new GTACourseNode(), new GTACourseNode(GTACourseNode.TYPE_INDIVIDUAL, null));
 				main.setContent(contentCtr.getInitialComponent());
 			} else if (menuCommand.equals(CMD_PROJECTBROKER)) { 
 				contentCtr = new GenericArchiveController(ureq, getWindowControl(), ores, false, new ProjectBrokerCourseNode());
diff --git a/src/main/java/org/olat/course/editor/ChooseNodeController.java b/src/main/java/org/olat/course/editor/ChooseNodeController.java
index 25ea9cc17d1391a11bc7bf6327446dabe88c97c8..5660952a4e82c0b928e88d58c5cb226964d36f16 100644
--- a/src/main/java/org/olat/course/editor/ChooseNodeController.java
+++ b/src/main/java/org/olat/course/editor/ChooseNodeController.java
@@ -139,28 +139,29 @@ public class ChooseNodeController extends BasicController {
 	
 	private void doCreateNode(String type) {
 		ICourse course = CourseFactory.getCourseEditSession(courseOres.getResourceableId());
+		CourseEditorTreeModel editorTreeModel = course.getEditorTreeModel();
+		CourseEditorTreeNode selectedNode = null;
+		int pos = 0;
+		if(editorTreeModel.getRootNode().equals(currentNode)) {
+			//root, add as last child
+			pos = currentNode.getChildCount();
+			selectedNode = currentNode;
+		} else {
+			selectedNode = (CourseEditorTreeNode)currentNode.getParent();
+			pos = currentNode.getPosition() + 1;
+		}
+		
 		// user chose a position to insert a new node
 		CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(type);
-		createdNode = newNodeConfig.getInstance();
+		createdNode = newNodeConfig.getInstance(selectedNode);
 
 		// Set some default values
 		String title = newNodeConfig.getLinkText(getLocale());
 		createdNode.setShortTitle(title);
 		createdNode.setNoAccessExplanation(translate("form.noAccessExplanation.default"));
 		
-		// Insert it now
-		CourseEditorTreeModel editorTreeModel = course.getEditorTreeModel();
-		if(editorTreeModel.getRootNode().equals(currentNode)) {
-			//root, add as last child
-			int pos = currentNode.getChildCount();
-			CourseNode selectedNode = currentNode.getCourseNode();
-			editorTreeModel.insertCourseNodeAt(createdNode, selectedNode, pos);
-		} else {
-			CourseEditorTreeNode parentNode = (CourseEditorTreeNode)currentNode.getParent();
-			CourseNode selectedNode = parentNode.getCourseNode();
-			int pos = currentNode.getPosition();
-			editorTreeModel.insertCourseNodeAt(createdNode, selectedNode, pos + 1);
-		}
+		// Add node
+		editorTreeModel.insertCourseNodeAt(createdNode, selectedNode.getCourseNode(), pos);
 		CourseFactory.saveCourseEditorTreeModel(course.getResourceableId());
 	}
 	
diff --git a/src/main/java/org/olat/course/editor/EditorMainController.java b/src/main/java/org/olat/course/editor/EditorMainController.java
index dee46399207c00d001c2a79606489e80c769ed9c..d6b7f26175d6a26c1bae40ed55b4fa193fde5f6e 100644
--- a/src/main/java/org/olat/course/editor/EditorMainController.java
+++ b/src/main/java/org/olat/course/editor/EditorMainController.java
@@ -436,16 +436,18 @@ public class EditorMainController extends MainLayoutBasicController implements G
 	 */
 	private void doCreateAlternateBuildingBlock(UserRequest ureq, ICourse course, CourseNode chosenNode, String selectAlternative) {
 		if(!StringHelper.containsNonWhitespace(selectAlternative)) return;
+		
+		//get the parrent node
+		CourseEditorTreeNode cetn = (CourseEditorTreeNode)cetm.getNodeById(chosenNode.getIdent());
+		CourseEditorTreeNode parentNode = (CourseEditorTreeNode)cetn.getParent();
+		int position = cetn.getPosition() + 1;
 
 		//create the alternative node
 		CourseNodeConfiguration newConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(selectAlternative);
-		CourseNode newNode = newConfig.getInstance();
+		CourseNode newNode = newConfig.getInstance(parentNode);
 		//copy configurations
 		chosenNode.copyConfigurationTo(newNode, course);
 		//insert the node
-		CourseEditorTreeNode cetn = (CourseEditorTreeNode)cetm.getNodeById(chosenNode.getIdent());
-		CourseEditorTreeNode parentNode = (CourseEditorTreeNode)cetn.getParent();
-		int position = cetn.getPosition() + 1;
 		CourseEditorTreeNode newCetn = course.getEditorTreeModel().insertCourseNodeAt(newNode, parentNode.getCourseNode(), position);
 		doInsert(ureq, newNode);
 		
@@ -521,6 +523,8 @@ public class EditorMainController extends MainLayoutBasicController implements G
 		String type = chosenNode.getType();
 		CourseNodeConfiguration cnConfig = CourseNodeFactory.getInstance().getCourseNodeConfigurationEvenForDisabledBB(type);
 		if (cnConfig.isEnabled()) {
+			CourseEditorTreeNode parent = (CourseEditorTreeNode) cetm.getNodeById(chosenNode.getIdent());
+			chosenNode.updateModuleConfigDefaults(false, parent);
 			nodeEditCntrllr = chosenNode.createEditController(ureq, getWindowControl(), stackPanel, course, euce);
 			listenTo(nodeEditCntrllr);
 			nodeEditCntrllr.addTabs(tabbedNodeConfig);
diff --git a/src/main/java/org/olat/course/editor/MultiSPController.java b/src/main/java/org/olat/course/editor/MultiSPController.java
index d53da1dd07c0edd2b2bbc9c213b7c5fed93afc80..ba4e7bf7133efd171799dd654c7a4033dd8e195b 100644
--- a/src/main/java/org/olat/course/editor/MultiSPController.java
+++ b/src/main/java/org/olat/course/editor/MultiSPController.java
@@ -211,14 +211,14 @@ public class MultiSPController extends FormBasicController {
 			CourseNode newNode = null;
 			if(item instanceof VFSLeaf) {
 				//create node
-				newNode = createCourseNode(item, "sp");
+				newNode = createCourseNode(parentNode, item, "sp");
 				ModuleConfiguration moduleConfig = newNode.getModuleConfiguration();
 				String path = VFSManager.getRelativeItemPath(item, rootContainer, null);
 				moduleConfig.set(SPEditController.CONFIG_KEY_FILE, path);
 				moduleConfig.setBooleanEntry(SPEditController.CONFIG_KEY_ALLOW_RELATIVE_LINKS, true);
 			} else if (item instanceof VFSContainer) {
 				//add structure
-				newNode = createCourseNode(item, "st");
+				newNode = createCourseNode(parentNode, item, "st");
 			}
 			
 			int pos = -1;
@@ -244,9 +244,9 @@ public class MultiSPController extends FormBasicController {
 		}
 	}
 	
-	private CourseNode createCourseNode(VFSItem item, String type) {
+	private CourseNode createCourseNode(CourseNode parent, VFSItem item, String type) {
 		CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(type);
-		CourseNode newNode = newNodeConfig.getInstance();
+		CourseNode newNode = newNodeConfig.getInstance(parent);
 		String name = item.getName();
 		if (name.length() > NodeConfigFormController.SHORT_TITLE_MAX_LENGTH) {
 			String shortName = name.substring(0, NodeConfigFormController.SHORT_TITLE_MAX_LENGTH - 1);
diff --git a/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java b/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java
index f4b8f7c3df3c976bc5df8c97ab42cd06fd468585..decc65f976eccd1449aeb7b82fe10a171474d6bd 100644
--- a/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java
+++ b/src/main/java/org/olat/course/folder/MergedCourseElementDataContainer.java
@@ -306,7 +306,8 @@ public class MergedCourseElementDataContainer extends MergeSource {
 	
 	private VFSContainer getBCContainer(ICourse course, BCCourseNode bcNode, NodeEvaluation nodeEval,
 			UserCourseEnvironment userCourseEnv, boolean isOlatAdmin) {
-		bcNode.updateModuleConfigDefaults(false);
+		CourseNode parent = bcNode.getParent() instanceof CourseNode? (CourseNode)bcNode.getParent(): null;
+		bcNode.updateModuleConfigDefaults(false, parent);
 		// add folder not to merge source. Use name and node id to have unique name
 		VFSContainer rootFolder = null;
 		String subpath = bcNode.getModuleConfiguration().getStringValue(BCCourseNode.CONFIG_SUBPATH);
diff --git a/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java b/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java
index 30324b6f5bf2d2116432052822be00433b73a7a4..aeeea5cb092c68139ced1cb2867c32f61ef90c1a 100644
--- a/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java
+++ b/src/main/java/org/olat/course/learningpath/LearningPathConfigs.java
@@ -37,6 +37,8 @@ public interface LearningPathConfigs {
 	public static final AssessmentObligation OBLIGATION_DEFAULT = AssessmentObligation.mandatory;
 	public static final FullyAssessedTrigger TRIGGER_DEFAULT = FullyAssessedTrigger.confirmed;
 	
+	public Boolean hasSequentialChildren();
+	
 	public Integer getDuration();
 	
 	public void setDuration(Integer duration);
diff --git a/src/main/java/org/olat/course/learningpath/LearningPathService.java b/src/main/java/org/olat/course/learningpath/LearningPathService.java
index ecddf214ee61fda9a80a10241c5888d074375350..7d6490763e8627c5a4a74d2fffdf4c4bc1d5c74a 100644
--- a/src/main/java/org/olat/course/learningpath/LearningPathService.java
+++ b/src/main/java/org/olat/course/learningpath/LearningPathService.java
@@ -37,6 +37,8 @@ public interface LearningPathService {
 	public LearningPathConfigs getConfigs(CourseNode courseNode);
 	
 	public LearningPathEditConfigs getEditConfigs(CourseNode courseNode);
+	
+	public SequenceConfig getSequenceConfig(CourseNode courseNode);
 
 	public List<CourseNode> getUnsupportedCourseNodes(ICourse course);
 
diff --git a/src/main/java/org/olat/course/learningpath/SequenceConfig.java b/src/main/java/org/olat/course/learningpath/SequenceConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..8c477723de3e3364bd2032978df95439184b6e4c
--- /dev/null
+++ b/src/main/java/org/olat/course/learningpath/SequenceConfig.java
@@ -0,0 +1,34 @@
+/**
+ * <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: 6 Feb 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public interface SequenceConfig {
+	
+	public boolean isInSequence();
+	
+	public boolean hasSequentialChildren();
+
+}
diff --git a/src/main/java/org/olat/course/learningpath/manager/LearningPathCourseTreeModelBuilder.java b/src/main/java/org/olat/course/learningpath/manager/LearningPathCourseTreeModelBuilder.java
index 3d62afc966b50964c48bb805a713240613102168..f9a5445497e58685f76b37ac7679e95036562103 100644
--- a/src/main/java/org/olat/course/learningpath/manager/LearningPathCourseTreeModelBuilder.java
+++ b/src/main/java/org/olat/course/learningpath/manager/LearningPathCourseTreeModelBuilder.java
@@ -19,6 +19,9 @@
  */
 package org.olat.course.learningpath.manager;
 
+import org.olat.core.CoreSpringFactory;
+import org.olat.course.learningpath.LearningPathService;
+import org.olat.course.learningpath.SequenceConfig;
 import org.olat.course.learningpath.evaluation.AccessEvaluator;
 import org.olat.course.learningpath.evaluation.LinearAccessEvaluator;
 import org.olat.course.learningpath.ui.LearningPathTreeNode;
@@ -28,6 +31,7 @@ import org.olat.course.run.userview.CourseTreeModelBuilder;
 import org.olat.course.run.userview.CourseTreeNode;
 import org.olat.course.run.userview.UserCourseEnvironment;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -39,14 +43,19 @@ public class LearningPathCourseTreeModelBuilder extends CourseTreeModelBuilder {
 
 	private static final AccessEvaluator accessEvaluator = new LinearAccessEvaluator();
 	
+	@Autowired
+	private LearningPathService learningPathService;
+	
 	public LearningPathCourseTreeModelBuilder(UserCourseEnvironment userCourseEnv) {
 		super(userCourseEnv);
+		CoreSpringFactory.autowireObject(this);
 	}
 
 	@Override
 	protected CourseTreeNode createCourseTreeNode(CourseNode courseNode, int treeLevel) {
 		AssessmentEvaluation assessmentEvaluation = userCourseEnv.getScoreAccounting().evalCourseNode(courseNode);
-		LearningPathTreeNode learningPathTreeNode = new LearningPathTreeNode(courseNode, treeLevel, assessmentEvaluation);
+		SequenceConfig sequenceConfig = learningPathService.getSequenceConfig(courseNode);
+		LearningPathTreeNode learningPathTreeNode = new LearningPathTreeNode(courseNode, treeLevel, sequenceConfig, assessmentEvaluation);
 		
 		learningPathTreeNode.setVisible(true);
 		boolean accessible = accessEvaluator.isAccessible(learningPathTreeNode, userCourseEnv);
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 fa2f7d70c957152c0d880dcee53f86b79c6c199c..ad06aba317fbe30da073124b214b72a68a16f558 100644
--- a/src/main/java/org/olat/course/learningpath/manager/LearningPathServiceImpl.java
+++ b/src/main/java/org/olat/course/learningpath/manager/LearningPathServiceImpl.java
@@ -22,12 +22,15 @@ package org.olat.course.learningpath.manager;
 import java.util.List;
 
 import org.olat.core.id.Identity;
+import org.olat.core.util.nodes.INode;
 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.learningpath.SequenceConfig;
+import org.olat.course.learningpath.model.SequenceConfigImpl;
 import org.olat.course.nodes.CollectingVisitor;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.tree.CourseEditorTreeModel;
@@ -60,6 +63,38 @@ public class LearningPathServiceImpl implements LearningPathService {
 		return registry.getLearningPathNodeHandler(courseNode).getEditConfigs();
 	}
 
+	@Override
+	public SequenceConfig getSequenceConfig(CourseNode courseNode) {
+		LearningPathConfigs lpConfig = registry.getLearningPathNodeHandler(courseNode).getConfigs(courseNode);
+		Boolean hasSequentialChildren = lpConfig.hasSequentialChildren();
+		Boolean inheritedSequencialChildren = getInheritedSequencialChildren(courseNode);
+		
+		boolean sequentialChildren = hasSequentialChildren != null
+				? hasSequentialChildren.booleanValue()                // Node defines config itself
+				: Boolean.TRUE.equals(inheritedSequencialChildren);   // use the inherited config
+		boolean inSequence = inheritedSequencialChildren != null
+				? inheritedSequencialChildren.booleanValue()
+				: sequentialChildren;                                 // root has no inherited config, take the config from the root itself
+		
+		return new SequenceConfigImpl( inSequence, sequentialChildren);
+	}
+	
+	private Boolean getInheritedSequencialChildren(CourseNode courseNode) {
+		INode parentNode = courseNode.getParent();
+		if (parentNode instanceof CourseNode) {
+			CourseNode parent = (CourseNode)parentNode;
+			LearningPathConfigs parentConfig = registry.getLearningPathNodeHandler(parent).getConfigs(parent);
+			
+			Boolean hasSequentialChildren = parentConfig.hasSequentialChildren();
+			if (hasSequentialChildren != null) {
+				return hasSequentialChildren;
+			}
+			
+			return getInheritedSequencialChildren(parent);
+		}
+		return null;
+	}
+	
 	@Override
 	public List<CourseNode> getUnsupportedCourseNodes(ICourse course) {
 		CourseEditorTreeModel editorTreeModel = course.getEditorTreeModel();
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 7de30970c74ffc0162a0e9900d67d66ec361babd..23340478d3aac6c9d34999c014463260c9a7be1d 100644
--- a/src/main/java/org/olat/course/learningpath/model/ModuleLearningPathConfigs.java
+++ b/src/main/java/org/olat/course/learningpath/model/ModuleLearningPathConfigs.java
@@ -58,6 +58,11 @@ public class ModuleLearningPathConfigs implements LearningPathConfigs {
 		this.doneOnFullyAssessed = doneOnFullyAssessed;
 	}
 
+	@Override
+	public Boolean hasSequentialChildren() {
+		return null;
+	}
+
 	@Override
 	public Integer getDuration() {
 		String duration = moduleConfiguration.getStringValue(CONFIG_KEY_DURATION);
diff --git a/src/main/java/org/olat/course/learningpath/model/SequenceConfigImpl.java b/src/main/java/org/olat/course/learningpath/model/SequenceConfigImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..93c2dc4a7fe49a57803f989aa55ea27dbd2ebc4e
--- /dev/null
+++ b/src/main/java/org/olat/course/learningpath/model/SequenceConfigImpl.java
@@ -0,0 +1,50 @@
+/**
+ * <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.model;
+
+import org.olat.course.learningpath.SequenceConfig;
+
+/**
+ * 
+ * Initial date: 6 Feb 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class SequenceConfigImpl implements SequenceConfig {
+	
+	private final boolean inSequence;
+	private final boolean sequentialChildren;
+	
+	public SequenceConfigImpl(boolean inSequence, boolean sequentialChildren) {
+		this.inSequence = inSequence;
+		this.sequentialChildren = sequentialChildren;
+	}
+
+	@Override
+	public boolean isInSequence() {
+		return inSequence;
+	}
+
+	@Override
+	public boolean hasSequentialChildren() {
+		return sequentialChildren;
+	}
+
+}
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 3c46f199efa2dd690629958b0d4dfc32876b514c..c8e8e5013522d24534680b86e5f5bca2c1885533 100644
--- a/src/main/java/org/olat/course/learningpath/model/UnsupportedLearningPathConfigs.java
+++ b/src/main/java/org/olat/course/learningpath/model/UnsupportedLearningPathConfigs.java
@@ -34,6 +34,11 @@ import org.olat.modules.assessment.model.AssessmentObligation;
  */
 public class UnsupportedLearningPathConfigs implements LearningPathConfigs {
 
+	@Override
+	public Boolean hasSequentialChildren() {
+		return null;
+	}
+	
 	@Override
 	public Integer getDuration() {
 		return null;
diff --git a/src/main/java/org/olat/course/learningpath/ui/LearningPathTreeNode.java b/src/main/java/org/olat/course/learningpath/ui/LearningPathTreeNode.java
index 3f79deff82dd205e11cc6d1618564da77cf02427..823b0db94b9b8b098c54522a02e5bee657bb57c8 100644
--- a/src/main/java/org/olat/course/learningpath/ui/LearningPathTreeNode.java
+++ b/src/main/java/org/olat/course/learningpath/ui/LearningPathTreeNode.java
@@ -21,6 +21,7 @@ package org.olat.course.learningpath.ui;
 
 import java.util.Date;
 
+import org.olat.course.learningpath.SequenceConfig;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.run.scoring.AssessmentEvaluation;
 import org.olat.course.run.userview.CourseTreeNode;
@@ -38,13 +39,20 @@ public class LearningPathTreeNode extends CourseTreeNode {
 
 	private static final long serialVersionUID = -9033714563825036957L;
 	
+	private final SequenceConfig sequenceConfig;
 	private final AssessmentEvaluation assessmentEvaluation;
 
-	public LearningPathTreeNode(CourseNode courseNode, int treeLevel, AssessmentEvaluation assessmentEvaluation) {
+	public LearningPathTreeNode(CourseNode courseNode, int treeLevel, SequenceConfig sequenceConfig,
+			AssessmentEvaluation assessmentEvaluation) {
 		super(courseNode, treeLevel);
+		this.sequenceConfig = sequenceConfig;
 		this.assessmentEvaluation = assessmentEvaluation;
 	}
-	
+
+	public SequenceConfig getSequenceConfig() {
+		return sequenceConfig;
+	}
+
 	public Date getStartDate() {
 		return assessmentEvaluation != null? assessmentEvaluation.getStartDate(): null;
 	}
diff --git a/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java b/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java
index b9f0b330fd25cfae06bf717622959dde14de3cc8..bdae7e27d4ed2281e9f9eaca5dd460a0214616c6 100644
--- a/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java
@@ -29,6 +29,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.olat.core.id.IdentityEnvironment;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.Condition;
 import org.olat.course.condition.additionalconditions.AdditionalCondition;
@@ -59,9 +60,10 @@ public abstract class AbstractAccessableCourseNode extends GenericCourseNode {
 	 * Constructor, only used by implementing course nodes
 	 * 
 	 * @param type The course node type
+	 * @param parent to init the module configuration
 	 */
-	protected AbstractAccessableCourseNode(String type) {
-		super(type);
+	protected AbstractAccessableCourseNode(String type, INode parent) {
+		super(type, parent);
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/AbstractFeedCourseNode.java b/src/main/java/org/olat/course/nodes/AbstractFeedCourseNode.java
index 88e040a6cee86cbfd0419e01f2eba45d760b2818..d542d5650fe77ea6d61106463b05397b2a7d8584 100644
--- a/src/main/java/org/olat/course/nodes/AbstractFeedCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/AbstractFeedCourseNode.java
@@ -40,6 +40,7 @@ import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.util.ValidationStatus;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.CourseModule;
 import org.olat.course.ICourse;
 import org.olat.course.condition.Condition;
@@ -91,9 +92,8 @@ public abstract class AbstractFeedCourseNode extends AbstractAccessableCourseNod
 	
 	protected Condition preConditionReader, preConditionPoster, preConditionModerator;
 
-	public AbstractFeedCourseNode(String type) {
-		super(type);
-		updateModuleConfigDefaults(true);
+	public AbstractFeedCourseNode(String type, INode parent) {
+		super(type, parent);
 	}
 	
 	protected abstract String getTranslatorPackage();
@@ -111,8 +111,6 @@ public abstract class AbstractFeedCourseNode extends AbstractAccessableCourseNod
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel,
 			ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
-		
 		String translatorPackage = getTranslatorPackage();
 		FeedUIFactory uiFactory = getFeedUIFactory(ureq.getLocale());
 		String resourceablTypeName = getResourceablTypeName();
@@ -131,8 +129,6 @@ public abstract class AbstractFeedCourseNode extends AbstractAccessableCourseNod
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
-		
 		RepositoryEntry entry = getReferencedRepositoryEntry();
 		FeedSecurityCallback callback = getFeedSecurityCallback(ureq, entry, userCourseEnv, nodeSecCallback);
 		SubscriptionContext subsContext = CourseModule.createSubscriptionContext(userCourseEnv.getCourseEnvironment(),
@@ -204,7 +200,7 @@ public abstract class AbstractFeedCourseNode extends AbstractAccessableCourseNod
 	}
 
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		int version = config.getConfigurationVersion();
 		
diff --git a/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java b/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java
index 97ddb99ffc8c5cea1efa6565335af5c1de5daada..771f1dec5d3348fde16bf6cf085c4015dcdf5f8f 100644
--- a/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/AdobeConnectCourseNode.java
@@ -71,7 +71,11 @@ public class AdobeConnectCourseNode extends AbstractAccessableCourseNode {
 	private transient CourseGroupManager groupMgr;
 	
 	public AdobeConnectCourseNode() {
-		super(TYPE);
+		this(null);
+	}
+
+	public AdobeConnectCourseNode(CourseNode parent) {
+		super(TYPE, parent);
 	}
 
 	private void updateModuleConfigDefaults(RepositoryEntry courseEntry, boolean isNewNode) {
diff --git a/src/main/java/org/olat/course/nodes/BCCourseNode.java b/src/main/java/org/olat/course/nodes/BCCourseNode.java
index 40763e7c65f1c9d99c6773f687eccacfb9848de4..2cf38dcdc345bd41fffb64f8baeba965fb7b649e 100644
--- a/src/main/java/org/olat/course/nodes/BCCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/BCCourseNode.java
@@ -46,6 +46,7 @@ import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.vfs.NamedContainerImpl;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
@@ -94,13 +95,15 @@ public class BCCourseNode extends AbstractAccessableCourseNode {
 	private Condition preConditionUploaders, preConditionDownloaders;
 
 	public BCCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public BCCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		BCCourseNodeEditController childTabCntrllr = new BCCourseNodeEditController(ureq, wControl, stackPanel, this, course, euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -116,7 +119,6 @@ public class BCCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		BCCourseNodeRunController bcCtrl = new BCCourseNodeRunController(ureq, wControl, userCourseEnv, this, nodeSecCallback.getNodeEvaluation());
 		if (StringHelper.containsNonWhitespace(nodecmd)) {
 			bcCtrl.activatePath(ureq, nodecmd);
@@ -129,8 +131,6 @@ public class BCCourseNode extends AbstractAccessableCourseNode {
 	public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
 			CourseNodeSecurityCallback nodeSecCallback) {
 		if (nodeSecCallback.isAccessible()) {
-			updateModuleConfigDefaults(false);
-			
 			// Create a folder peekview controller that shows the latest two entries
 			VFSContainer rootFolder = null;
 			if(getModuleConfiguration().getBooleanSafe(CONFIG_AUTO_FOLDER)) {
@@ -316,7 +316,8 @@ public class BCCourseNode extends AbstractAccessableCourseNode {
 
 	@Override
 	public StatusDescription isConfigValid() {
-		updateModuleConfigDefaults(false);
+		CourseNode parent = this.getParent() instanceof CourseNode? (CourseNode)this.getParent(): null;
+		updateModuleConfigDefaults(false, parent);
 
 		StatusDescription sd = StatusDescription.NOERROR;
 		if(!getModuleConfiguration().getBooleanSafe(CONFIG_AUTO_FOLDER)){
@@ -427,7 +428,7 @@ public class BCCourseNode extends AbstractAccessableCourseNode {
 	}
 
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		int version = config.getConfigurationVersion();
 		
diff --git a/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java b/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
index 025b95a4f0be31b0880b7043b9edcdf3a01d0d78..40ed539453018fa811ff2b3466258442b3d4e649 100644
--- a/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
+++ b/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
@@ -39,6 +39,7 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Roles;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.editor.ConditionAccessEditConfig;
 import org.olat.course.editor.CourseEditorEnv;
@@ -88,13 +89,15 @@ public class BasicLTICourseNode extends AbstractAccessableCourseNode {
 	private static final String NLS_ERROR_HOSTMISSING_LONG = "error.hostmissing.long";
 
 	public BasicLTICourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public BasicLTICourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		LTIEditController childTabCntrllr = new LTIEditController(getModuleConfiguration(), ureq, wControl, this, course, euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -108,8 +111,6 @@ public class BasicLTICourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
-		
 		Controller runCtrl;
 		if(userCourseEnv.isCourseReadOnly()) {
 			Translator trans = Util.createPackageTranslator(BasicLTICourseNode.class, ureq.getLocale());
@@ -146,6 +147,8 @@ public class BasicLTICourseNode extends AbstractAccessableCourseNode {
 
 	@Override
 	public Controller createPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) {
+		CourseNode parent = this.getParent() instanceof CourseNode? (CourseNode)this.getParent(): null;
+		updateModuleConfigDefaults(false, parent);
 		return createNodeRunConstructionResult(ureq, wControl, userCourseEnv, nodeSecCallback, null).getRunController();
 	}
 
@@ -197,13 +200,12 @@ public class BasicLTICourseNode extends AbstractAccessableCourseNode {
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
 	 * set to usefull default values
-	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
 	 *          previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// use defaults for new course building blocks
diff --git a/src/main/java/org/olat/course/nodes/BlogCourseNode.java b/src/main/java/org/olat/course/nodes/BlogCourseNode.java
index 55b86ce0906de5f26113db71d178d0e2e5e474c1..b3805951cf92b3f3e77b41536dece2f802429683 100644
--- a/src/main/java/org/olat/course/nodes/BlogCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/BlogCourseNode.java
@@ -22,6 +22,7 @@ package org.olat.course.nodes;
 import java.util.Locale;
 
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.feed.blog.BlogCourseNodeConfiguration;
 import org.olat.fileresource.types.BlogFileResource;
 import org.olat.modules.webFeed.manager.FeedManager;
@@ -45,8 +46,8 @@ public class BlogCourseNode extends AbstractFeedCourseNode {
 	
 	public static final String TYPE = FeedManager.KIND_BLOG;
 
-	public BlogCourseNode() {
-		super(TYPE);
+	public BlogCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/COCourseNode.java b/src/main/java/org/olat/course/nodes/COCourseNode.java
index 55569090b610f7c150a039e1d91880094afd4d33..34d637b986874da93222785b45d2d17541504136 100755
--- a/src/main/java/org/olat/course/nodes/COCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/COCourseNode.java
@@ -40,6 +40,7 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Roles;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -72,14 +73,16 @@ public class COCourseNode extends AbstractAccessableCourseNode {
 
     private static final String TYPE = "co";
 
-    public COCourseNode() {
-        super(TYPE);
-        updateModuleConfigDefaults(true);
-    }
+	public COCourseNode() {
+		this(null);
+	}
+	
+	public COCourseNode(INode parent) {
+		super(TYPE, parent);
+	}
 
     @Override
     public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-        updateModuleConfigDefaults(false);
         COEditController childTabCntrllr = new COEditController(getModuleConfiguration(), ureq, wControl, euce);
         CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
         return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -93,7 +96,6 @@ public class COCourseNode extends AbstractAccessableCourseNode {
     @Override
     public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
             UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-    	updateModuleConfigDefaults(false);
         Controller controller;
         // Do not allow guests to send anonymous emails
         Roles roles = ureq.getUserSession().getRoles();
@@ -220,7 +222,8 @@ public class COCourseNode extends AbstractAccessableCourseNode {
 
     @Override
     public StatusDescription isConfigValid() {
-    	updateModuleConfigDefaults(false);
+		CourseNode parent = this.getParent() instanceof CourseNode? (CourseNode)this.getParent(): null;
+    	updateModuleConfigDefaults(false, parent);
         if (oneClickStatusCache != null) { return oneClickStatusCache[0]; }
 
         /**
@@ -360,7 +363,7 @@ public class COCourseNode extends AbstractAccessableCourseNode {
     }
 
     @Override
-    public void updateModuleConfigDefaults(boolean isNewNode) {
+    public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
         ModuleConfiguration mc = getModuleConfiguration();
         int version = mc.getConfigurationVersion();
         
diff --git a/src/main/java/org/olat/course/nodes/CPCourseNode.java b/src/main/java/org/olat/course/nodes/CPCourseNode.java
index 9997a809ef562756ec16af93fe55ef224056afcb..55abf30ca7bca2dd1af0f429f88adf8dcc9baa04 100644
--- a/src/main/java/org/olat/course/nodes/CPCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/CPCourseNode.java
@@ -42,6 +42,7 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
@@ -77,13 +78,15 @@ public class CPCourseNode extends AbstractAccessableCourseNode {
 	private static final String TYPE = "cp";
 
 	public CPCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public CPCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		CPEditController childTabCntrllr = new CPEditController(ureq, wControl, stackPanel, this);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -97,7 +100,6 @@ public class CPCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		OLATResourceable ores = OresHelper.createOLATResourceableInstance(ICourse.class, userCourseEnv.getCourseEnvironment().getCourseResourceableId());
 		CPRunController cprunC = new CPRunController(getModuleConfiguration(), ureq, wControl, this, nodecmd, ores, false);
 		return cprunC.createNodeRunConstructionResult(ureq, null);
@@ -105,7 +107,6 @@ public class CPCourseNode extends AbstractAccessableCourseNode {
 
 	@Override
 	public Controller createPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) {
-		updateModuleConfigDefaults(false);
 		OLATResourceable ores = OresHelper.createOLATResourceableInstance(ICourse.class, userCourseEnv.getCourseEnvironment().getCourseResourceableId());
 		return new CPRunController(getModuleConfiguration(), ureq, wControl, this, null, ores, true);
 	}
@@ -161,13 +162,12 @@ public class CPCourseNode extends AbstractAccessableCourseNode {
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
 	 * set to usefull default values
-	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
 	 *          previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		int CURRENTVERSION = 7;
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
diff --git a/src/main/java/org/olat/course/nodes/CalCourseNode.java b/src/main/java/org/olat/course/nodes/CalCourseNode.java
index a7f117c070f4b0bac1cea252f0fa0f1b86098f6c..e1b3b42064f6e1e95ee73aad3d44d6cec69dd911 100644
--- a/src/main/java/org/olat/course/nodes/CalCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/CalCourseNode.java
@@ -29,6 +29,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.Condition;
 import org.olat.course.condition.interpreter.ConditionExpression;
@@ -63,16 +64,16 @@ public class CalCourseNode extends AbstractAccessableCourseNode {
 	public static final String EDIT_CONDITION_ID = "editarticle";
 	private Condition preConditionEdit;
 
-	/**
-	 * Default constructor for course node of type calendar
-	 */
 	public CalCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public CalCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// use defaults for new course building blocks
@@ -103,29 +104,17 @@ public class CalCourseNode extends AbstractAccessableCourseNode {
 		postExportCondition(preConditionEdit, envMapper, backwardsCompatible);
 	}
 
-	/**
-	 * @see org.olat.course.nodes.CourseNode#createEditController(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.WindowControl, org.olat.course.ICourse)
-	 */
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		CalEditController childTabCntrllr = new CalEditController(getModuleConfiguration(), ureq, wControl, this, course, euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
 
 	}
 
-	/**
-	 * @see org.olat.course.nodes.CourseNode#createNodeRunConstructionResult(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.WindowControl,
-	 *      org.olat.course.run.userview.UserCourseEnvironment,
-	 *      org.olat.course.run.userview.NodeEvaluation)
-	 */
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		CalRunController calCtlr = new CalRunController(wControl, ureq, this, userCourseEnv, nodeSecCallback.getNodeEvaluation());
 		Controller wrapperCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, calCtlr, this, "o_cal_icon");
 		return new NodeRunConstructionResult(wrapperCtrl);
diff --git a/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java b/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java
index 1b4f06f6305f6e3250b18689b971aea7269d3018..f3cb0fa08608f3526441dad1758cb77c9db3de56 100644
--- a/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/Card2BrainCourseNode.java
@@ -30,6 +30,7 @@ import org.olat.core.gui.control.generic.messages.MessageUIFactory;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -63,13 +64,16 @@ public class Card2BrainCourseNode extends AbstractAccessableCourseNode {
 	public static final String CONFIG_PRIVATE_SECRET = "privateSecret";
 	
 	public Card2BrainCourseNode() {
-		super(TYPE);
+		this(null);
+	}
+
+	public Card2BrainCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel,
 			ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		Card2BrainEditController childTabCntrllr = new Card2BrainEditController(ureq, wControl, getModuleConfiguration());
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -83,9 +87,6 @@ public class Card2BrainCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		
-		updateModuleConfigDefaults(false);
-		
 		Controller runCtrl;
 		if(userCourseEnv.isCourseReadOnly()) {
 			Translator trans = Util.createPackageTranslator(Card2BrainCourseNode.class, ureq.getLocale());
diff --git a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
index 93606362dc8e4e64d41013fd4aae2015fd60c77b..626cb4f40e94825aba27c3788e391cd0951003bc 100644
--- a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
@@ -49,6 +49,7 @@ import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
@@ -111,13 +112,15 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode {
 	public static final String FOLDER_NAME = "checklistfiles";
 
 	public CheckListCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public CheckListCourseNode(CourseNode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		CheckListEditController childTabCntrllr = new CheckListEditController(this, ureq, wControl, course);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -131,8 +134,6 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			final UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
-
 		Controller ctrl;
 		OLATResourceable ores = OresHelper.createOLATResourceableInstance("CourseModule", userCourseEnv.getCourseEnvironment().getCourseResourceableId());
 		Roles roles = ureq.getUserSession().getRoles();
@@ -627,13 +628,12 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode {
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
 	 * set to usefull default values
-	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
 	 *          previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			config.setConfigurationVersion(1);
diff --git a/src/main/java/org/olat/course/nodes/CourseNode.java b/src/main/java/org/olat/course/nodes/CourseNode.java
index dcd7c8879795eac0f9b9093a11853ed59420a1cb..0fd359770b8b6e56ae179f0eff936cedbc33504c 100644
--- a/src/main/java/org/olat/course/nodes/CourseNode.java
+++ b/src/main/java/org/olat/course/nodes/CourseNode.java
@@ -409,14 +409,16 @@ public interface CourseNode extends INode, ShortName {
 	 * @return
 	 */
 	public List<StatusDescription> publishUpdatesExplanations(CourseEditorEnv cev);
-
+	
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
-	 * set to usefull default values
+	 * set to usefull default values.
 	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
-	 *          previous behaviour
+	 *          previous behavior.
+	 * @param parent Can be used to inherit default values.
+	 *          May be null if root node. Is of type CourseNode or CourseEditorTreeNode.
 	 *          
 	 * This is the workflow:
 	 * On every click on a entry of the navigation tree, this method will be called
@@ -429,7 +431,7 @@ public interface CourseNode extends INode, ShortName {
 	 * otherwise the editortree.xml and runstructure.xml of old courses would no longer be compatible. 
 	 *  
 	 */
-	public void updateModuleConfigDefaults(boolean isNewNode);
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent);
 	
 	/**
 	 * Calculate the access and the visibility in the conventional node access type.
diff --git a/src/main/java/org/olat/course/nodes/CourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/CourseNodeConfiguration.java
index c6546a077d17920bfca0eb93f0b60d18bf7527d1..e1054e29db5ccad29f2f7fc90eb1689497789481 100644
--- a/src/main/java/org/olat/course/nodes/CourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/CourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.List;
 import java.util.Locale;
 
 import org.olat.core.configuration.ConfigOnOff;
+import org.olat.core.util.nodes.INode;
 /**
  * 
  * Interface for course nodes
@@ -39,7 +40,7 @@ public interface CourseNodeConfiguration extends ConfigOnOff{
 	
 	public String getGroup();
 	
-	public CourseNode getInstance();
+	public CourseNode getInstance(INode parent);
 	
 	public String getLinkText(Locale locale);
 	
diff --git a/src/main/java/org/olat/course/nodes/CourseNodeFactory.java b/src/main/java/org/olat/course/nodes/CourseNodeFactory.java
index 39ad1c135db9fe44d3bd37a43cfa5e211de2e1bf..ba3ccae6998b3eb4f3b7ab387151aa243775437a 100644
--- a/src/main/java/org/olat/course/nodes/CourseNodeFactory.java
+++ b/src/main/java/org/olat/course/nodes/CourseNodeFactory.java
@@ -41,6 +41,7 @@ import org.olat.core.configuration.PreWarm;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.CorruptedCourseException;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.handlers.EditionSupport;
@@ -216,7 +217,7 @@ public class CourseNodeFactory implements PreWarm {
 		}
 
 		@Override
-		public CourseNode getInstance() {
+		public CourseNode getInstance(INode parent) {
 			return null;
 		}
 
diff --git a/src/main/java/org/olat/course/nodes/DialogCourseNode.java b/src/main/java/org/olat/course/nodes/DialogCourseNode.java
index bc473f40397cd70233eccb534ab7a8d049a8b77f..dfe2f94e38b5df2b6ca1245a9362900aec8bf1d2 100644
--- a/src/main/java/org/olat/course/nodes/DialogCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/DialogCourseNode.java
@@ -42,6 +42,7 @@ import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.vfs.LocalFolderImpl;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
@@ -95,13 +96,15 @@ public class DialogCourseNode extends AbstractAccessableCourseNode {
 	private Condition preConditionReader, preConditionPoster, preConditionModerator;
 
 	public DialogCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public DialogCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		DialogCourseNodeEditController childTabCntrllr = new DialogCourseNodeEditController(ureq, wControl, this, course, euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -117,7 +120,6 @@ public class DialogCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		DialogSecurityCallback secCallback = SecurityCallbackFactory.create(this, userCourseEnv, nodeSecCallback.getNodeEvaluation());
 		DialogCourseNodeRunController ctrl = new DialogCourseNodeRunController(ureq, wControl, this, userCourseEnv, secCallback);
 		Controller wrappedCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, ctrl, this, "o_dialog_icon");
@@ -156,13 +158,12 @@ public class DialogCourseNode extends AbstractAccessableCourseNode {
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
 	 * set to usefull default values
-	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
 	 *          previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		int version = config.getConfigurationVersion();
 		
diff --git a/src/main/java/org/olat/course/nodes/ENCourseNode.java b/src/main/java/org/olat/course/nodes/ENCourseNode.java
index 87bc2f52c11a98010e626c30d0a6c3a70a6f415d..8ec4dcbde38aa66141dde7021cb8ef50db4505e5 100644
--- a/src/main/java/org/olat/course/nodes/ENCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ENCourseNode.java
@@ -48,6 +48,7 @@ import org.olat.core.id.Roles;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.filter.FilterFactory;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -130,12 +131,16 @@ public class ENCourseNode extends AbstractAccessableCourseNode {
 	private static final int CURRENT_CONFIG_VERSION = 3;
 
 	public ENCourseNode() {
-		super(TYPE);
-		initDefaultConfig();
+		this(null);
+	}
+
+	public ENCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
+		//TODO uh 
 		migrateConfig();
 		ENEditController childTabCntrllr = new ENEditController(getModuleConfiguration(), ureq, wControl, euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
diff --git a/src/main/java/org/olat/course/nodes/EdubaseCourseNode.java b/src/main/java/org/olat/course/nodes/EdubaseCourseNode.java
index d43cf38862e08215cebb8315b0fc9252c1cb45f6..f759ef79f08fba4a365fbc969932f27141673e03 100644
--- a/src/main/java/org/olat/course/nodes/EdubaseCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/EdubaseCourseNode.java
@@ -29,6 +29,7 @@ import org.olat.core.gui.control.generic.messages.MessageUIFactory;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -61,14 +62,16 @@ public class EdubaseCourseNode extends AbstractAccessableCourseNode {
 	public static final String CONFIG_BOOK_SECTIONS = "bookSections";
 	
 	public EdubaseCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public EdubaseCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel,
 			ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		EdubaseEditController childTabCntrllr = new EdubaseEditController(ureq, wControl, this);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -82,7 +85,6 @@ public class EdubaseCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		Controller runCtrl;
 		if(userCourseEnv.isCourseReadOnly()) {
 			Translator trans = Util.createPackageTranslator(EdubaseCourseNode.class, ureq.getLocale());
@@ -130,7 +132,7 @@ public class EdubaseCourseNode extends AbstractAccessableCourseNode {
 	}
 	
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			config.setBooleanEntry(CONFIG_DESCRIPTION_ENABLED, Boolean.TRUE.booleanValue());
diff --git a/src/main/java/org/olat/course/nodes/FOCourseNode.java b/src/main/java/org/olat/course/nodes/FOCourseNode.java
index 1c136ea5a513d5be9878d8a0294b0e0939081a95..9c6c7beb9350e41967654d0eabfa7d5e3b809d4e 100644
--- a/src/main/java/org/olat/course/nodes/FOCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/FOCourseNode.java
@@ -52,6 +52,7 @@ import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.coordinate.SyncerCallback;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.CourseModule;
 import org.olat.course.ICourse;
@@ -115,14 +116,16 @@ public class FOCourseNode extends AbstractAccessableCourseNode {
 	private Condition preConditionReader, preConditionPoster, preConditionModerator;
 
 	public FOCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public FOCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel,
 			ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		FOCourseNodeEditController childTabCntrllr = new FOCourseNodeEditController(ureq, wControl, this, course, euce);
 		CourseNode chosenNode = course.getEditorTreeModel()
 				.getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
@@ -137,7 +140,6 @@ public class FOCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			final UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		Roles roles = ureq.getUserSession().getRoles();
 		Forum theForum = loadOrCreateForum(userCourseEnv.getCourseEnvironment());
 		boolean isAdministrator = userCourseEnv.isAdmin();
@@ -211,7 +213,8 @@ public class FOCourseNode extends AbstractAccessableCourseNode {
 	 * @return the loaded forum
 	 */
 	public Forum loadOrCreateForum(final CourseEnvironment courseEnv) {
-		updateModuleConfigDefaults(false);
+		CourseNode parent = this.getParent() instanceof CourseNode? (CourseNode)this.getParent(): null;
+		updateModuleConfigDefaults(false, parent);
 
 		Forum forum = null;
 		List<Property> forumKeyProps = courseEnv.getCoursePropertyManager().findCourseNodeProperties(this, null, null,
@@ -491,13 +494,12 @@ public class FOCourseNode extends AbstractAccessableCourseNode {
 	/**
 	 * Update the module configuration to have all mandatory configuration flags set
 	 * to usefull default values
-	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading from
 	 *                  previous node configuration version, set default to maintain
 	 *                  previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		int version = config.getConfigurationVersion();
 
diff --git a/src/main/java/org/olat/course/nodes/GTACourseNode.java b/src/main/java/org/olat/course/nodes/GTACourseNode.java
index 67e81815151597927fe324573e17ec431531322e..b0e9acc67dfa1d7fd2e7f51536450224bc9d5583 100644
--- a/src/main/java/org/olat/course/nodes/GTACourseNode.java
+++ b/src/main/java/org/olat/course/nodes/GTACourseNode.java
@@ -55,6 +55,7 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
 import org.olat.core.util.io.ShieldOutputStream;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
@@ -162,13 +163,11 @@ public class GTACourseNode extends AbstractAccessableCourseNode {
 	public static final String TYPE_INDIVIDUAL = "ita";
 
 	public GTACourseNode() {
-		super(TYPE_GROUP);
-        updateModuleConfigDefaults(true);
+		this(TYPE_GROUP, null);
 	}
 	
-	public GTACourseNode(String type) {
-		super(type);
-        updateModuleConfigDefaults(true);
+	public GTACourseNode(String type, INode parent) {
+		super(type, parent);
 	}
 
 	@Override
@@ -182,7 +181,7 @@ public class GTACourseNode extends AbstractAccessableCourseNode {
 	}
 	
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		if(isNewNode) {
 			//setup default configuration
 			ModuleConfiguration config = getModuleConfiguration();
@@ -798,7 +797,6 @@ public class GTACourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		
 		Controller controller;
 		Roles roles = ureq.getUserSession().getRoles();
 		if (roles.isGuestOnly()) {
diff --git a/src/main/java/org/olat/course/nodes/GenericCourseNode.java b/src/main/java/org/olat/course/nodes/GenericCourseNode.java
index bb35ec268b66298d21c455680c1b7f61c2217e2c..61d25423889b9770d1bffeee450c2778129e2c75 100644
--- a/src/main/java/org/olat/course/nodes/GenericCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/GenericCourseNode.java
@@ -45,6 +45,7 @@ import org.olat.core.util.CodeHelper;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.nodes.GenericNode;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.xml.XStreamHelper;
 import org.olat.course.ICourse;
 import org.olat.course.condition.Condition;
@@ -85,14 +86,13 @@ public abstract class GenericCourseNode extends GenericNode implements CourseNod
 	 * Generic course node constructor
 	 * 
 	 * @param type The course node type
-	 *      
-	 *      ATTENTION:
-	 *      all course nodes must call updateModuleConfigDefaults(true) here
+	 * @param parent to init the module config
 	 */
-	public GenericCourseNode(String type) {
+	public GenericCourseNode(String type, INode parent) {
 		super();
 		this.type = type;
-		moduleConfiguration = new ModuleConfiguration();
+		this.moduleConfiguration = new ModuleConfiguration();
+		this.updateModuleConfigDefaults(true, parent);
 	}
 
 	/**
@@ -633,7 +633,7 @@ public abstract class GenericCourseNode extends GenericNode implements CourseNod
 	}
 
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		//
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java b/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java
index 44726d1513bb7dbde2bf40a0ed1136bf1ed932ab..d81c8241b41d70b219aa5694a30047a0246701ea 100644
--- a/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/GoToMeetingCourseNode.java
@@ -33,6 +33,7 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Roles;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -68,11 +69,15 @@ public class GoToMeetingCourseNode extends AbstractAccessableCourseNode {
 	private transient CourseGroupManager groupMgr;
 
 	public GoToMeetingCourseNode() {
-		super(TYPE);
+		this(null);
+	}
+
+	public GoToMeetingCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		// no update to default config necessary
 	}
 	
@@ -85,7 +90,6 @@ public class GoToMeetingCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel,
 			ICourse course, UserCourseEnvironment userCourseEnv) {
-		updateModuleConfigDefaults(false);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(userCourseEnv.getCourseEditorEnv().getCurrentCourseNodeId());
 		// create edit controller
 		GoToMeetingEditController childTabCntrllr = new GoToMeetingEditController(ureq, wControl);
@@ -104,8 +108,6 @@ public class GoToMeetingCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
-
 		Controller controller;
 		Roles roles = ureq.getUserSession().getRoles();
 		if (roles.isGuestOnly()) {
diff --git a/src/main/java/org/olat/course/nodes/IQSELFCourseNode.java b/src/main/java/org/olat/course/nodes/IQSELFCourseNode.java
index a01d7a10b915a6dcc4ffb27378791c43e293124d..b005c23bcfed4a83fcf92a4384b0fa37da711d6b 100644
--- a/src/main/java/org/olat/course/nodes/IQSELFCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/IQSELFCourseNode.java
@@ -47,6 +47,7 @@ import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.assessment.AssessmentManager;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -105,8 +106,11 @@ public class IQSELFCourseNode extends AbstractAccessableCourseNode implements Se
 	public static final String TYPE = "iqself";
 
 	public IQSELFCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public IQSELFCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
@@ -305,13 +309,12 @@ public class IQSELFCourseNode extends AbstractAccessableCourseNode implements Se
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
 	 * set to usefull default values
-	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
 	 *          previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// add default module configuration
diff --git a/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java b/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java
index d00262f67e071650e814d297b60a9b378b4f6737..ff62aa20607e8c3dec94b2ccfd410386616ce6a9 100644
--- a/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java
@@ -48,6 +48,7 @@ import org.olat.core.id.Roles;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
 import org.olat.core.util.coordinate.CoordinatorManager;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.ICourse;
 import org.olat.course.assessment.AssessmentManager;
@@ -105,8 +106,11 @@ public class IQSURVCourseNode extends AbstractAccessableCourseNode implements QT
 	private static final String PACKAGE_IQ = Util.getPackageName(IQRunController.class);
 	
 	public IQSURVCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public IQSURVCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
@@ -324,13 +328,12 @@ public class IQSURVCourseNode extends AbstractAccessableCourseNode implements QT
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
 	 * set to usefull default values
-	 *
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
 	 *          previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// add default module configuration
diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
index 509f7a5eac90e0bc82f9deb841380fdeff853fca..f9d1270ac8cce2d41d156a22c366409aba4e94da 100644
--- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
@@ -51,6 +51,7 @@ import org.olat.core.id.Roles;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
 import org.olat.core.util.coordinate.CoordinatorManager;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.ICourse;
 import org.olat.course.archiver.ScoreAccountingHelper;
@@ -136,13 +137,15 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements QT
 	private static final int CURRENT_CONFIG_VERSION = 2;
 
 	public IQTESTCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public IQTESTCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 	
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		TabbableController childTabCntrllr = new IQEditController(ureq, wControl, stackPanel, course, this, euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -156,8 +159,6 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements QT
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);		
-		
 		Controller controller;
 		// Do not allow guests to start tests
 		Roles roles = ureq.getUserSession().getRoles();
@@ -565,13 +566,12 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements QT
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
 	 * set to usefull default values
-	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
 	 *          previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// add default module configuration
diff --git a/src/main/java/org/olat/course/nodes/InfoCourseNode.java b/src/main/java/org/olat/course/nodes/InfoCourseNode.java
index cae371c5a1a3668919b70c08880d060cc5a65678..395be586f44ed4f1d61039dfa87661d407f3195d 100644
--- a/src/main/java/org/olat/course/nodes/InfoCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/InfoCourseNode.java
@@ -35,6 +35,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.CourseModule;
 import org.olat.course.ICourse;
 import org.olat.course.condition.Condition;
@@ -73,12 +74,15 @@ public class InfoCourseNode extends AbstractAccessableCourseNode {
 	private Condition preConditionAdmin;
 	
 	public InfoCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public InfoCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 	
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// use defaults for new course building blocks
@@ -148,7 +152,6 @@ public class InfoCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-
 		InfoRunController infoCtrl = new InfoRunController(ureq, wControl, userCourseEnv, nodeSecCallback.getNodeEvaluation(), this);
 		Controller titledCtrl = TitledWrapperHelper.getWrapper(ureq, wControl, infoCtrl, this, "o_infomsg_icon");
 		return new NodeRunConstructionResult(titledCtrl);
diff --git a/src/main/java/org/olat/course/nodes/LiveStreamCourseNode.java b/src/main/java/org/olat/course/nodes/LiveStreamCourseNode.java
index 3708873adb6066415c75ddfeea04bd887aa515c3..5bcb7e91c45f2584c277e5ab0b25303d8e0c5a0e 100644
--- a/src/main/java/org/olat/course/nodes/LiveStreamCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/LiveStreamCourseNode.java
@@ -30,6 +30,7 @@ import org.olat.core.gui.control.generic.messages.MessageUIFactory;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -68,14 +69,16 @@ public class LiveStreamCourseNode extends AbstractAccessableCourseNode {
 	public static final String CONFIG_PLAYER_PROFILE = "playerProfile";
 
 	public LiveStreamCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public LiveStreamCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel,
 			ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		LiveStreamEditController editCtrl = new LiveStreamEditController(ureq, wControl, getModuleConfiguration());
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, editCtrl);
@@ -89,8 +92,6 @@ public class LiveStreamCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
-		
 		Controller runCtrl;
 		if (userCourseEnv.isCourseReadOnly()) {
 			Translator trans = Util.createPackageTranslator(Card2BrainCourseNode.class, ureq.getLocale());
@@ -130,7 +131,7 @@ public class LiveStreamCourseNode extends AbstractAccessableCourseNode {
 	}
 	
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			LiveStreamModule liveStreamModule = CoreSpringFactory.getImpl(LiveStreamModule.class);
diff --git a/src/main/java/org/olat/course/nodes/MSCourseNode.java b/src/main/java/org/olat/course/nodes/MSCourseNode.java
index 36a0a1fcb72798589bccf391222b2f5d2f5b832c..88db6c8443caf97b34b85984a136a81982bec8e2 100644
--- a/src/main/java/org/olat/course/nodes/MSCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/MSCourseNode.java
@@ -49,6 +49,7 @@ import org.olat.core.id.Organisation;
 import org.olat.core.id.Roles;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.assessment.CourseAssessmentService;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -131,8 +132,11 @@ public class MSCourseNode extends AbstractAccessableCourseNode {
 	public static final String CONFIG_DEFAULT_EVAL_FORM_SCALE = "1.0";
 
 	public MSCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public MSCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	/**
@@ -153,7 +157,7 @@ public class MSCourseNode extends AbstractAccessableCourseNode {
 	}
 	
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			initDefaultConfig(config);
@@ -178,7 +182,6 @@ public class MSCourseNode extends AbstractAccessableCourseNode {
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		MSCourseNodeEditController childTabCntrllr = new MSCourseNodeEditController(ureq, wControl, this, course, euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
diff --git a/src/main/java/org/olat/course/nodes/MembersCourseNode.java b/src/main/java/org/olat/course/nodes/MembersCourseNode.java
index a1445e464ccb1d931076edc5329a192558b2bfd7..b6e2b5dc9336897894c893912c557fd5d0366010 100644
--- a/src/main/java/org/olat/course/nodes/MembersCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/MembersCourseNode.java
@@ -30,6 +30,7 @@ import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.editor.NodeEditController;
@@ -92,8 +93,11 @@ public class MembersCourseNode extends AbstractAccessableCourseNode {
 
 
 	public MembersCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public MembersCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
@@ -122,7 +126,6 @@ public class MembersCourseNode extends AbstractAccessableCourseNode {
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		MembersCourseNodeEditController childTabCntrllr = new MembersCourseNodeEditController(ureq, wControl, euce, this.getModuleConfiguration());
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -131,8 +134,6 @@ public class MembersCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
-
 		Controller controller;
 		Roles roles = ureq.getUserSession().getRoles();
 		if (roles.isGuestOnly()) {
@@ -149,12 +150,11 @@ public class MembersCourseNode extends AbstractAccessableCourseNode {
 
 	@Override
 	public Controller createPeekViewRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) {
-		updateModuleConfigDefaults(false);
 		return new MembersPeekViewController(ureq, wControl, userCourseEnv, getModuleConfiguration());
 	}
 	
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		int version = config.getConfigurationVersion();
 		if(isNewNode){
diff --git a/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java b/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java
index 959c239ed17b09dd1dfc634376682df491f1fc0e..d4e81d20dd5b0539e825256224008939b13e0229 100644
--- a/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/OpenMeetingsCourseNode.java
@@ -31,6 +31,7 @@ import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
@@ -69,11 +70,15 @@ public class OpenMeetingsCourseNode extends AbstractAccessableCourseNode {
 	private transient CourseGroupManager groupMgr;
 
 	public OpenMeetingsCourseNode() {
-		super(TYPE);
+		this(null);
+	}
+	
+	public OpenMeetingsCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		// no update to default config necessary
 	}
 	
@@ -86,7 +91,6 @@ public class OpenMeetingsCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course,
 			UserCourseEnvironment userCourseEnv) {
-		updateModuleConfigDefaults(false);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(userCourseEnv.getCourseEditorEnv().getCurrentCourseNodeId());
 		// create edit controller
 		OpenMeetingsEditController childTabCntrllr = new OpenMeetingsEditController(ureq, wControl, this, course);
@@ -105,8 +109,6 @@ public class OpenMeetingsCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
-
 		// check if user is moderator of the virtual classroom
 		boolean admin = userCourseEnv.isAdmin();
 		boolean moderator = admin || userCourseEnv.isCoach();
diff --git a/src/main/java/org/olat/course/nodes/PFCourseNode.java b/src/main/java/org/olat/course/nodes/PFCourseNode.java
index 27e97004412e7ac99f4f9441f5b68f9137d4d4c6..8cd50eb1201104b78b46e757e7e9191633a6315d 100644
--- a/src/main/java/org/olat/course/nodes/PFCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/PFCourseNode.java
@@ -40,6 +40,7 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.vfs.LocalFolderImpl;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.course.CourseModule;
@@ -78,12 +79,15 @@ public class PFCourseNode extends AbstractAccessableCourseNode {
 	public static final long serialVersionUID = 1L;
 
 	public PFCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public PFCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		if (isNewNode) {
 			// default is to enable both boxes without restrictions
 			updateModuleConfig(true,true,true, false, 0, false, null, null);
diff --git a/src/main/java/org/olat/course/nodes/PodcastCourseNode.java b/src/main/java/org/olat/course/nodes/PodcastCourseNode.java
index f8ac350b7b307122cdfa26958871f7227944fd27..8e6887dc4cf6e919b3365b74c74c25f83ffbc1e2 100644
--- a/src/main/java/org/olat/course/nodes/PodcastCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/PodcastCourseNode.java
@@ -22,6 +22,7 @@ package org.olat.course.nodes;
 import java.util.Locale;
 
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.feed.podcast.PodcastCourseNodeConfiguration;
 import org.olat.fileresource.types.PodcastFileResource;
 import org.olat.modules.webFeed.manager.FeedManager;
@@ -45,8 +46,8 @@ public class PodcastCourseNode extends AbstractFeedCourseNode {
 	
 	public static final String TYPE = FeedManager.KIND_PODCAST;
 
-	public PodcastCourseNode() {
-		super(TYPE);
+	public PodcastCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java b/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java
index ab394044b081dc29ddffeffb9fe2204139916200..4070b56f15930e5bb9328f0d40ac78227d22350b 100644
--- a/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/PortfolioCourseNode.java
@@ -42,6 +42,7 @@ import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.ValidationStatus;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.Condition;
 import org.olat.course.condition.interpreter.ConditionInterpreter;
@@ -93,12 +94,15 @@ public class PortfolioCourseNode extends AbstractAccessableCourseNode {
 	private Condition preConditionEdit;
 	
 	public PortfolioCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public PortfolioCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 	
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			MSCourseNode.initDefaultConfig(config);
@@ -133,7 +137,6 @@ public class PortfolioCourseNode extends AbstractAccessableCourseNode {
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
 		PortfolioCourseNodeEditController childTabCntrllr = new PortfolioCourseNodeEditController(ureq, wControl, stackPanel,
 				course, this, getModuleConfiguration(), euce);
-		updateModuleConfigDefaults(false);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
 	}
@@ -146,7 +149,6 @@ public class PortfolioCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		Controller controller;
 		Roles roles = ureq.getUserSession().getRoles();
 		if (roles.isGuestOnly()) {
diff --git a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
index ed5e7021a578d5a60597886288153a7f9ae2173f..d8ea39eb0fca56e47be8b4eb72b45f872db7de96 100644
--- a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java
@@ -68,6 +68,7 @@ import org.olat.core.util.FileUtils;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.vfs.LocalFileImpl;
 import org.olat.core.util.vfs.LocalFolderImpl;
 import org.olat.core.util.vfs.VFSContainer;
@@ -169,13 +170,15 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 	private Condition  conditionProjectBroker;
 
 	public ProjectBrokerCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public ProjectBrokerCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		ProjectBrokerCourseEditorController childTabCntrllr = ProjectBrokerControllerFactory.createCourseEditController(ureq, wControl, course, euce, this );
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		NodeEditController editController = new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -186,7 +189,6 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		Controller controller;
 		// Do not allow guests to access tasks
 		Roles roles = ureq.getUserSession().getRoles();
@@ -662,7 +664,7 @@ public class ProjectBrokerCourseNode extends GenericCourseNode {
 	}
 
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// use defaults for new course building blocks
diff --git a/src/main/java/org/olat/course/nodes/SPCourseNode.java b/src/main/java/org/olat/course/nodes/SPCourseNode.java
index ad600fa0b26cb9424f67ef5d96d97f79d7ce9b40..c66d035f46f0fa899d52d851c66c3a2daeadc9f9 100644
--- a/src/main/java/org/olat/course/nodes/SPCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/SPCourseNode.java
@@ -35,6 +35,7 @@ import org.olat.core.gui.control.generic.iframe.DeliveryOptions;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.course.CourseModule;
@@ -64,17 +65,16 @@ public class SPCourseNode extends AbstractAccessableCourseNode {
 	private static final long serialVersionUID = -4565145351110778757L;
 	public static final String TYPE = "sp";
 
-	/**
-	 * Default constructor for course node of type single page
-	 */
 	public SPCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public SPCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		SPEditController childTabCntrllr = new SPEditController(getModuleConfiguration(), ureq, wControl, this, course, euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		NodeEditController nodeEditController = new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -91,8 +91,6 @@ public class SPCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
-
 		VFSContainer container = userCourseEnv.getCourseEnvironment().getCourseFolderContainer();
 		SPRunController runController = new SPRunController(wControl, ureq, userCourseEnv, this, container);
 		return new NodeRunConstructionResult(runController);
@@ -174,13 +172,12 @@ public class SPCourseNode extends AbstractAccessableCourseNode {
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
 	 * set to usefull default values
-	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
 	 *          previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// use defaults for new course building blocks
diff --git a/src/main/java/org/olat/course/nodes/STCourseNode.java b/src/main/java/org/olat/course/nodes/STCourseNode.java
index 8bab1a76b64efda5367a5cecbc050faa7a71ea04..3ef10356ce2532eef69c4c645f1a83b928822370 100644
--- a/src/main/java/org/olat/course/nodes/STCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/STCourseNode.java
@@ -49,6 +49,7 @@ import org.olat.core.logging.AssertException;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.CourseFactory;
 import org.olat.course.CourseModule;
@@ -74,6 +75,7 @@ import org.olat.course.run.scoring.ScoreCalculator;
 import org.olat.course.run.scoring.ScoreEvaluation;
 import org.olat.course.run.userview.CourseNodeSecurityCallback;
 import org.olat.course.run.userview.UserCourseEnvironment;
+import org.olat.course.tree.CourseEditorTreeNode;
 import org.olat.course.tree.CourseInternalLinkTreeModel;
 import org.olat.modules.ModuleConfiguration;
 import org.olat.repository.RepositoryEntry;
@@ -112,15 +114,17 @@ public class STCourseNode extends AbstractAccessableCourseNode {
 	transient private Condition scoreExpression;
 	transient private Condition passedExpression;
 	transient private Condition failedExpression;
-
+	
 	public STCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public STCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		STCourseNodeEditController childTabCntrllr = new STCourseNodeEditController(ureq, wControl, this, course, euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		NodeEditController nodeEditController = new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -137,7 +141,6 @@ public class STCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			final UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		Controller cont;
 		
 		String displayType = getModuleConfiguration().getStringValue(STCourseNodeEditController.CONFIG_KEY_DISPLAY_TYPE);
@@ -344,13 +347,12 @@ public class STCourseNode extends AbstractAccessableCourseNode {
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
 	 * set to usefull default values
-	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
 	 *          previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// use defaults for new course building blocks
@@ -401,11 +403,34 @@ public class STCourseNode extends AbstractAccessableCourseNode {
 			}
 		}
 		if (config.getConfigurationVersion() < 5) {
-			config.setStringValue(CONFIG_LP_SEQUENCE_KEY, CONFIG_LP_SEQUENCE_DEFAULT);
+			STCourseNode stParent = getFirstSTParent(parent);
+			String sequence = stParent != null
+					? stParent.getModuleConfiguration().getStringValue(CONFIG_LP_SEQUENCE_KEY, CONFIG_LP_SEQUENCE_DEFAULT)
+					: CONFIG_LP_SEQUENCE_DEFAULT;
+			config.setStringValue(CONFIG_LP_SEQUENCE_KEY, sequence);
 		}
 		
 		config.setConfigurationVersion(CURRENT_VERSION);
 	}
+	
+	private STCourseNode getFirstSTParent(INode node) {
+		if (node != null) {
+			CourseNode courseNode = null;
+			if (node instanceof CourseEditorTreeNode) {
+				CourseEditorTreeNode cetn = (CourseEditorTreeNode)node;
+				courseNode = cetn.getCourseNode();
+			}
+			if (node instanceof CourseNode) {
+				courseNode = (CourseNode)node;
+			}
+			if (courseNode instanceof STCourseNode) {
+				return (STCourseNode)courseNode;
+			}
+			INode parentNode = node.getParent();
+			return getFirstSTParent(parentNode);
+		}
+		return null;
+	}
 
 	@Override
     public void postCopy(CourseEnvironmentMapper envMapper, Processing processType, ICourse course, ICourse sourceCrourse) {
diff --git a/src/main/java/org/olat/course/nodes/ScormCourseNode.java b/src/main/java/org/olat/course/nodes/ScormCourseNode.java
index 8fee5b84cd85c5a391522af36c04e0290ab3e1d6..ae97f85dd537b437a9023942aef5fb4a1dbbcf87 100644
--- a/src/main/java/org/olat/course/nodes/ScormCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ScormCourseNode.java
@@ -51,6 +51,7 @@ import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.editor.ConditionAccessEditConfig;
 import org.olat.course.editor.CourseEditorEnv;
@@ -96,13 +97,15 @@ public class ScormCourseNode extends AbstractAccessableCourseNode {
 	private final static String CONFIG_HEIGHT_AUTO = "auto";
 	
 	public ScormCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+
+	public ScormCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		ScormEditController childTabCntrllr = new ScormEditController(this, ureq, wControl, course);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -116,7 +119,6 @@ public class ScormCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		ScormRunController cprunC = new ScormRunController(getModuleConfiguration(), ureq, userCourseEnv, wControl, this, false);
 		Controller ctrl = TitledWrapperHelper.getWrapper(ureq, wControl, cprunC, this, "o_scorm_icon");
 		// no inline-in-olat-menu integration possible: no display configuration option
@@ -125,7 +127,6 @@ public class ScormCourseNode extends AbstractAccessableCourseNode {
 
 	@Override
 	public Controller createPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback) {
-		updateModuleConfigDefaults(false);
 		ScormRunController cprunC = new ScormRunController(getModuleConfiguration(), ureq, userCourseEnv, wControl, this, true);
 		return new NodeRunConstructionResult(cprunC).getRunController();
 	}
@@ -225,13 +226,12 @@ public class ScormCourseNode extends AbstractAccessableCourseNode {
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
 	 * set to usefull default values
-	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
 	 *          previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// use defaults for new course building blocks
diff --git a/src/main/java/org/olat/course/nodes/SurveyCourseNode.java b/src/main/java/org/olat/course/nodes/SurveyCourseNode.java
index e1aa6d4fd3101665a6ba85dc87beafcd65886cf3..7c4831555f2765992ad3d6b86534d2215603f3e7 100644
--- a/src/main/java/org/olat/course/nodes/SurveyCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/SurveyCourseNode.java
@@ -39,6 +39,7 @@ import org.olat.core.id.Organisation;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -101,8 +102,11 @@ public class SurveyCourseNode extends AbstractAccessableCourseNode {
 	public static final String CONFIG_KEY_REPORT_FOR_GUEST = "report.for.guest";
 
 	public SurveyCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public SurveyCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
@@ -141,7 +145,6 @@ public class SurveyCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel,
 			ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		RepositoryEntry courseEntry = euce.getCourseEditorEnv().getCourseGroupManager().getCourseEntry();
 		TabbableController childTabCtrl	= new SurveyEditController(ureq, wControl, this, courseEntry);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
@@ -200,7 +203,7 @@ public class SurveyCourseNode extends AbstractAccessableCourseNode {
 	}
 	
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			config.setBooleanEntry(CONFIG_KEY_EXECUTION_BY_OWNER, false);
diff --git a/src/main/java/org/olat/course/nodes/TACourseNode.java b/src/main/java/org/olat/course/nodes/TACourseNode.java
index 84e5d25006fc4993ee45cd14a358cf7fa145087f..2e6f0a9944f687652b08aa86573fafa43488b113 100644
--- a/src/main/java/org/olat/course/nodes/TACourseNode.java
+++ b/src/main/java/org/olat/course/nodes/TACourseNode.java
@@ -62,6 +62,7 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.core.util.ZipUtil;
 import org.olat.core.util.io.ShieldOutputStream;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.vfs.NamedContainerImpl;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
@@ -172,13 +173,15 @@ public class TACourseNode extends GenericCourseNode {
 	private static final Logger log = Tracing.createLoggerFor(TACourseNode.class);
 
 	public TACourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public TACourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		TACourseNodeEditController childTabCntrllr = new TACourseNodeEditController(ureq, wControl, course, this, euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -187,7 +190,6 @@ public class TACourseNode extends GenericCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		Controller controller;
 		// Do not allow guests to access tasks
 		Roles roles = ureq.getUserSession().getRoles();
@@ -715,7 +717,7 @@ public class TACourseNode extends GenericCourseNode {
 	 * Init config parameter with default values for a new course node.
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// use defaults for new course building blocks
diff --git a/src/main/java/org/olat/course/nodes/TUCourseNode.java b/src/main/java/org/olat/course/nodes/TUCourseNode.java
index cb80d26765e5388741daa1d021299a677d52c3a8..b1974b49438e1d508fc0c2878a4bd10b28be569e 100644
--- a/src/main/java/org/olat/course/nodes/TUCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/TUCourseNode.java
@@ -33,6 +33,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.editor.ConditionAccessEditConfig;
 import org.olat.course.editor.CourseEditorEnv;
@@ -61,13 +62,15 @@ public class TUCourseNode extends AbstractAccessableCourseNode {
 	private static final String NLS_ERROR_HOSTMISSING_LONG = "error.hostmissing.long";
 
 	public TUCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public TUCourseNode(CourseNode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		TUEditController childTabCntrllr = new TUEditController(getModuleConfiguration(), ureq, wControl, stackPanel, this, course);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -81,7 +84,6 @@ public class TUCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		return new NodeRunConstructionResult(new TURunController(wControl, getModuleConfiguration(), ureq, this, userCourseEnv.getCourseEnvironment()));
 	}
 
@@ -138,13 +140,12 @@ public class TUCourseNode extends AbstractAccessableCourseNode {
 	/**
 	 * Update the module configuration to have all mandatory configuration flags
 	 * set to usefull default values
-	 * 
 	 * @param isNewNode true: an initial configuration is set; false: upgrading
 	 *          from previous node configuration version, set default to maintain
 	 *          previous behaviour
 	 */
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// use defaults for new course building blocks
diff --git a/src/main/java/org/olat/course/nodes/VideoCourseNode.java b/src/main/java/org/olat/course/nodes/VideoCourseNode.java
index 51c8e9e3fddcc5127107da6c08c7bf181190fe5c..c1c9e7edaa9eba37c906b9187e70d03682767476 100644
--- a/src/main/java/org/olat/course/nodes/VideoCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/VideoCourseNode.java
@@ -32,6 +32,7 @@ import org.olat.core.gui.control.generic.tabbable.TabbableController;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.ICourse;
 import org.olat.course.condition.ConditionEditController;
 import org.olat.course.editor.ConditionAccessEditConfig;
@@ -62,13 +63,15 @@ public class VideoCourseNode extends AbstractAccessableCourseNode {
 	public static final String TYPE = "video";
 
 	public VideoCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	
+	public VideoCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
-		updateModuleConfigDefaults(false);
 		VideoEditController childTabCntrllr = new VideoEditController(this, ureq, wControl, course, euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
@@ -94,7 +97,6 @@ public class VideoCourseNode extends AbstractAccessableCourseNode {
 			UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback,
 			String nodecmd) {
-		updateModuleConfigDefaults(false);
 		VideoRunController cprunC = new VideoRunController(getModuleConfiguration(), wControl, ureq, userCourseEnv, this);
 		return cprunC.createNodeRunConstructionResult(ureq);
 	}
diff --git a/src/main/java/org/olat/course/nodes/ViteroCourseNode.java b/src/main/java/org/olat/course/nodes/ViteroCourseNode.java
index 165ebbb500873e51668984294a3e08b8e02f63b8..95d037d2cf24c7dc4ec4b99abab8535544a1b39b 100644
--- a/src/main/java/org/olat/course/nodes/ViteroCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/ViteroCourseNode.java
@@ -32,6 +32,7 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Roles;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.course.CourseModule;
 import org.olat.course.ICourse;
@@ -68,18 +69,21 @@ public class ViteroCourseNode extends AbstractAccessableCourseNode {
 	public static final String CONF_VC_CONFIGURATION = "vc_configuration";
 
 	public ViteroCourseNode() {
-		super(TYPE);
+		this(null);
+	}
+	
+	public ViteroCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		// no update to default config necessary
 	}
 
 	@Override
 	public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course,
 			UserCourseEnvironment userCourseEnv) {
-		updateModuleConfigDefaults(false);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(userCourseEnv.getCourseEditorEnv().getCurrentCourseNodeId());
 		// create edit controller
 		ViteroEditController childTabCntrllr = new ViteroEditController(ureq, wControl, this, course, userCourseEnv);
@@ -98,7 +102,6 @@ public class ViteroCourseNode extends AbstractAccessableCourseNode {
 	@Override
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, CourseNodeSecurityCallback nodeSecCallback, String nodecmd) {
-		updateModuleConfigDefaults(false);
 		Controller runCtr;
 		Roles roles = ureq.getUserSession().getRoles();
 		if (roles.isGuestOnly()) {
diff --git a/src/main/java/org/olat/course/nodes/WikiCourseNode.java b/src/main/java/org/olat/course/nodes/WikiCourseNode.java
index d96436a8b7c4c45d697ccc35bdd31838fc62c9b0..faf51a6fdd5067fb167417e4115b8e8d290adae8 100644
--- a/src/main/java/org/olat/course/nodes/WikiCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/WikiCourseNode.java
@@ -50,6 +50,7 @@ import org.olat.core.logging.Tracing;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.course.ICourse;
 import org.olat.course.condition.Condition;
@@ -89,16 +90,15 @@ public class WikiCourseNode extends AbstractAccessableCourseNode {
 	public static final String TYPE = "wiki";
 	private Condition preConditionEdit;
 
-	/**
-	 * Default constructor for course node of type single page
-	 */
 	public WikiCourseNode() {
-		super(TYPE);
-		updateModuleConfigDefaults(true);
+		this(null);
+	}
+	public WikiCourseNode(INode parent) {
+		super(TYPE, parent);
 	}
 
 	@Override
-	public void updateModuleConfigDefaults(boolean isNewNode) {
+	public void updateModuleConfigDefaults(boolean isNewNode, INode parent) {
 		ModuleConfiguration config = getModuleConfiguration();
 		if (isNewNode) {
 			// use defaults for new course building blocks
@@ -124,7 +124,6 @@ public class WikiCourseNode extends AbstractAccessableCourseNode {
 		WikiEditController childTabCntrllr = new WikiEditController(getModuleConfiguration(), ureq, wControl, this, course,euce);
 		CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
 		return new NodeEditController(ureq, wControl, course, chosenNode, euce, childTabCntrllr);
-
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectCourseNodeConfiguration.java
index dde60a2a1b10f35fe3e42417d6a22d8c4449bf24..145a8dc5fe2a8c1830838ce84989ed2452ede05c 100644
--- a/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/adobeconnect/AdobeConnectCourseNodeConfiguration.java
@@ -24,6 +24,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.AdobeConnectCourseNode;
 import org.olat.course.nodes.CourseNode;
@@ -70,7 +71,7 @@ public class AdobeConnectCourseNodeConfiguration extends AbstractCourseNodeConfi
 	}
 
 	@Override
-	public CourseNode getInstance() {
+	public CourseNode getInstance(INode parent) {
 		return new AdobeConnectCourseNode();
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/basiclti/LTICourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/basiclti/LTICourseNodeConfiguration.java
index 07f46e3eccabdb589bfeaeec3b837c9c42f9416f..b8acb01f4137b26d5dc320eb3a5eb8e3daa64ca7 100644
--- a/src/main/java/org/olat/course/nodes/basiclti/LTICourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/basiclti/LTICourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.BasicLTICourseNode;
 import org.olat.course.nodes.CourseNode;
@@ -48,8 +49,8 @@ public class LTICourseNodeConfiguration extends AbstractCourseNodeConfiguration
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new BasicLTICourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new BasicLTICourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/bc/BCCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/bc/BCCourseNodeConfiguration.java
index 8838e808f26eff5c71bd86a2cfdf1745d3bb3e10..6e9f33a0152f1b97e38f66ffec123a099e15892c 100644
--- a/src/main/java/org/olat/course/nodes/bc/BCCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/bc/BCCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.BCCourseNode;
 import org.olat.course.nodes.CourseNode;
@@ -43,8 +44,8 @@ public class BCCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new BCCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new BCCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/cal/CalCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/cal/CalCourseNodeConfiguration.java
index 23f56a92a823b216dc5f6fc082e237cd81a0e832..7525a8d1bf6bd3ce6deb5f5b2efd4bc04a26e1cd 100644
--- a/src/main/java/org/olat/course/nodes/cal/CalCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/cal/CalCourseNodeConfiguration.java
@@ -26,6 +26,7 @@ import org.olat.commons.calendar.CalendarModule;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CalCourseNode;
 import org.olat.course.nodes.CourseNode;
@@ -47,8 +48,8 @@ public class CalCourseNodeConfiguration extends AbstractCourseNodeConfiguration
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new CalCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new CalCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainCourseNodeConfiguration.java
index 53bf48cd3f93fc2ae6e0cce3aeb167dae3cdf044..bca34ec96c88d85ac3dd884ed7ee30f307a4e635 100644
--- a/src/main/java/org/olat/course/nodes/card2brain/Card2BrainCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/card2brain/Card2BrainCourseNodeConfiguration.java
@@ -24,6 +24,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.Card2BrainCourseNode;
 import org.olat.course.nodes.CourseNode;
@@ -50,8 +51,8 @@ public class Card2BrainCourseNodeConfiguration extends AbstractCourseNodeConfigu
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new Card2BrainCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new Card2BrainCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/cl/CheckListCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/cl/CheckListCourseNodeConfiguration.java
index 11b2644ced1a99940b4f4535f26598ccf2936d36..5db31b17575328be1bd40c301c11fba2f7b4934e 100644
--- a/src/main/java/org/olat/course/nodes/cl/CheckListCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/cl/CheckListCourseNodeConfiguration.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CheckListCourseNode;
 import org.olat.course.nodes.CourseNode;
@@ -42,8 +43,8 @@ public class CheckListCourseNodeConfiguration extends AbstractCourseNodeConfigur
 	}
 	
 	@Override
-	public CourseNode getInstance() {
-		return new CheckListCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new CheckListCourseNode(null);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java
index 18fd397628beaa3a6baabc6e14be879c7dc6a3d9..528b1fa9c93b2a20995c9ca87ea15cae133257d6 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java
@@ -84,15 +84,15 @@ public class CheckListStepRunnerCallback implements StepRunnerCallback {
 		CourseEnvironment courseEnv = course.getCourseEnvironment();
 		CheckboxManager checkboxManager = CoreSpringFactory.getImpl(CheckboxManager.class);
 		
-		CourseNode structureNode = createCourseNode(data.getStructureShortTitle(), data.getStructureTitle(), data.getStructureObjectives(), "st");
-		CourseEditorTreeNode parentNode = (CourseEditorTreeNode)course.getEditorTreeModel().getRootNode();
-		course.getEditorTreeModel().addCourseNode(structureNode, parentNode.getCourseNode());
+		CourseNode rootNode = ((CourseEditorTreeNode)course.getEditorTreeModel().getRootNode()).getCourseNode();
+		CourseNode structureNode = createCourseNode(rootNode, data.getStructureShortTitle(), data.getStructureTitle(), data.getStructureObjectives(), "st");
+		course.getEditorTreeModel().addCourseNode(structureNode, rootNode);
 		
 		List<CheckListNode> nodes = data.getNodes();
 		List<String> nodesIdent = new ArrayList<>();
 		for(CheckListNode node:nodes) {
 			String title = node.getTitle();
-			CheckListCourseNode checkNode = (CheckListCourseNode)createCourseNode(title, title, null, "checklist");
+			CheckListCourseNode checkNode = (CheckListCourseNode)createCourseNode(structureNode, title, title, null, "checklist");
 			nodesIdent.add(checkNode.getIdent());
 
 			ModuleConfiguration config = checkNode.getModuleConfiguration();
@@ -173,9 +173,9 @@ public class CheckListStepRunnerCallback implements StepRunnerCallback {
 		stNode.setScoreCalculator(sc);
 	}
 	
-	private CourseNode createCourseNode(String shortTitle, String title, String objectives, String type) {
+	private CourseNode createCourseNode(CourseNode parent, String shortTitle, String title, String objectives, String type) {
 		CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(type);
-		CourseNode newNode = newNodeConfig.getInstance();
+		CourseNode newNode = newNodeConfig.getInstance(parent);
 		newNode.setShortTitle(shortTitle);
 		newNode.setLongTitle(title);
 		newNode.setLearningObjectives(objectives);
diff --git a/src/main/java/org/olat/course/nodes/co/COCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/co/COCourseNodeConfiguration.java
index 67b1d363e0fa96d8d84e566d26e47ecb00127ed9..0a1dfd290edc46b440c077fae6c324655eed5328 100755
--- a/src/main/java/org/olat/course/nodes/co/COCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/co/COCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.COCourseNode;
 import org.olat.course.nodes.CourseNode;
@@ -42,8 +43,8 @@ public class COCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new COCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new COCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/cp/CPCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/cp/CPCourseNodeConfiguration.java
index db4d9b02aa9dbf33861647ace96b528a6647af9d..ea5a53479bab510b96d6805f36c22016a3437f94 100644
--- a/src/main/java/org/olat/course/nodes/cp/CPCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/cp/CPCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CPCourseNode;
 import org.olat.course.nodes.CourseNode;
@@ -43,8 +44,8 @@ public class CPCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new CPCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new CPCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeConfiguration.java
index 905865c4d75458d7aa1ede34698607c0f9c4aeea..17cecfdc0f1561eda1268b8310337a1f1c2e9c8b 100644
--- a/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/dialog/DialogCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -56,8 +57,8 @@ public class DialogCourseNodeConfiguration extends AbstractCourseNodeConfigurati
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new DialogCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new DialogCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/edubase/EdubaseCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/edubase/EdubaseCourseNodeConfiguration.java
index ec9141e5c3872c74be5ee41ebb6e258d2cd96726..a5b1d9400c916ec5efd3f79b83209ad03666f69a 100644
--- a/src/main/java/org/olat/course/nodes/edubase/EdubaseCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/edubase/EdubaseCourseNodeConfiguration.java
@@ -24,6 +24,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -50,8 +51,8 @@ public class EdubaseCourseNodeConfiguration extends AbstractCourseNodeConfigurat
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new EdubaseCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new EdubaseCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/en/ENCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/en/ENCourseNodeConfiguration.java
index 35ea437633654f45498ec4b1aead9673b387999b..8253a9dd7d5b129ef4c5606b52c6bb6f05152f4a 100644
--- a/src/main/java/org/olat/course/nodes/en/ENCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/en/ENCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -45,8 +46,8 @@ public class ENCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new ENCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new ENCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/en/ENWebService.java b/src/main/java/org/olat/course/nodes/en/ENWebService.java
index d8e8c5f2476a10ff9a641d8172c59cf4660a93a4..6e3aaceea87da6e34c441f3cce002fa552551fd7 100644
--- a/src/main/java/org/olat/course/nodes/en/ENWebService.java
+++ b/src/main/java/org/olat/course/nodes/en/ENWebService.java
@@ -218,7 +218,7 @@ public class ENWebService extends AbstractCourseNodeWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 
-		CourseNode node = getParentNode(course, nodeId);
+		CourseNode node = getParentNode(course, nodeId).getCourseNode();
 		ModuleConfiguration config = node.getModuleConfiguration();
 		String groupNames = (String)config.get(ENCourseNode.CONFIG_GROUPNAME);
 		@SuppressWarnings("unchecked")
diff --git a/src/main/java/org/olat/course/nodes/feed/blog/BlogCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/feed/blog/BlogCourseNodeConfiguration.java
index e1bb814f8342646924d89b28edb59f23fea8d157..9a19a066560bc3b27fdc9272574f9af0e6eeb417 100644
--- a/src/main/java/org/olat/course/nodes/feed/blog/BlogCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/feed/blog/BlogCourseNodeConfiguration.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.BlogCourseNode;
 import org.olat.course.nodes.CourseNode;
@@ -61,8 +62,8 @@ public class BlogCourseNodeConfiguration extends AbstractCourseNodeConfiguration
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new BlogCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new BlogCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/feed/podcast/PodcastCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/feed/podcast/PodcastCourseNodeConfiguration.java
index 465e847606f3e3c7645e6073af4bc0f495de14f8..e1fa03e29f004a304c1836b6d625d26ef451eb4c 100644
--- a/src/main/java/org/olat/course/nodes/feed/podcast/PodcastCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/feed/podcast/PodcastCourseNodeConfiguration.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -61,8 +62,8 @@ public class PodcastCourseNodeConfiguration extends AbstractCourseNodeConfigurat
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new PodcastCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new PodcastCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/fo/FOCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/fo/FOCourseNodeConfiguration.java
index b1e9ad390340cf8d82f40734445c1be801c2f1a3..6e16cb2024ca86e1c112bf420309d4c46c433a6f 100644
--- a/src/main/java/org/olat/course/nodes/fo/FOCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/fo/FOCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -47,8 +48,8 @@ public class FOCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new FOCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new FOCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/gotomeeting/GoToMeetingCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/gotomeeting/GoToMeetingCourseNodeConfiguration.java
index 7078a27172fb52645e6c41f70bd57aff9773c30f..796ab6ff448d9b4632067fbef0c9bef83666e022 100644
--- a/src/main/java/org/olat/course/nodes/gotomeeting/GoToMeetingCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/gotomeeting/GoToMeetingCourseNodeConfiguration.java
@@ -24,6 +24,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -55,10 +56,11 @@ public class GoToMeetingCourseNodeConfiguration extends AbstractCourseNodeConfig
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new GoToMeetingCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new GoToMeetingCourseNode(parent);
 	}
 
+	@Override
 	public String getLinkText(Locale locale) {
 		Translator fallback = Util.createPackageTranslator(CourseNodeConfiguration.class, locale);
 		Translator translator = Util.createPackageTranslator(this.getClass(), locale, fallback);
diff --git a/src/main/java/org/olat/course/nodes/gta/GTACourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/gta/GTACourseNodeConfiguration.java
index c2db876c3673043511dacc17e17dd7db490a7b5a..63e360d1c9ef5cbc910663b39fb31c2f6b8cfaa1 100644
--- a/src/main/java/org/olat/course/nodes/gta/GTACourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/gta/GTACourseNodeConfiguration.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -45,8 +46,8 @@ public class GTACourseNodeConfiguration extends AbstractCourseNodeConfiguration
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new GTACourseNode(getAlias());
+	public CourseNode getInstance(INode parent) {
+		return new GTACourseNode(getAlias(), parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/info/InfoCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/info/InfoCourseNodeConfiguration.java
index 7be09a5dd9ebb5d0b58e158c0d29db45c77db30f..85634fce2cdb59c1197a5b768e119a8f089c0a34 100644
--- a/src/main/java/org/olat/course/nodes/info/InfoCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/info/InfoCourseNodeConfiguration.java
@@ -24,6 +24,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -56,8 +57,8 @@ public class InfoCourseNodeConfiguration extends AbstractCourseNodeConfiguration
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new InfoCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new InfoCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/iq/IQSELFCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/iq/IQSELFCourseNodeConfiguration.java
index ad980374339bd0c01a1d2695b47d435a1d2bc71a..b0cb44f5468964cb2f87e27f83f294fb99fec576 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQSELFCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQSELFCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -45,8 +46,8 @@ public class IQSELFCourseNodeConfiguration extends AbstractCourseNodeConfigurati
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new IQSELFCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new IQSELFCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/iq/IQSURVCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/iq/IQSURVCourseNodeConfiguration.java
index 4b8f1c53a8cde64228f4771ea6761dde60036e1b..de0bdb3fa06522491701fc9847ac78552b09c683 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQSURVCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQSURVCourseNodeConfiguration.java
@@ -30,6 +30,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -46,8 +47,8 @@ public class IQSURVCourseNodeConfiguration extends AbstractCourseNodeConfigurati
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new IQSURVCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new IQSURVCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/iq/IQTESTCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/iq/IQTESTCourseNodeConfiguration.java
index 321416d372a0895caf8f338d2fa9900d155ad7a9..9bd89ae3701aad09f461f3684846a7c806091a8b 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQTESTCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQTESTCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -41,16 +42,13 @@ import org.olat.course.nodes.IQTESTCourseNode;
  */
 public class IQTESTCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	
-	/**
-	 * [spring]
-	 */
 	private IQTESTCourseNodeConfiguration() {
 		super();
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new IQTESTCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new IQTESTCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/livestream/LiveStreamCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/livestream/LiveStreamCourseNodeConfiguration.java
index 32b5fc30f0138ed9304cf54c1b67d53d37babcad..676d1e5e1520ff11c88b11669a99fa12f7621eab 100644
--- a/src/main/java/org/olat/course/nodes/livestream/LiveStreamCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/livestream/LiveStreamCourseNodeConfiguration.java
@@ -24,6 +24,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeGroup;
@@ -49,8 +50,8 @@ public class LiveStreamCourseNodeConfiguration extends AbstractCourseNodeConfigu
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new LiveStreamCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new LiveStreamCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/members/MembersCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/members/MembersCourseNodeConfiguration.java
index ac3cb5d8fe99552d0e1f11c0e5ccf25abe15baa2..231c57a468d05514028352bfb64c3137c0e5ef59 100644
--- a/src/main/java/org/olat/course/nodes/members/MembersCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/members/MembersCourseNodeConfiguration.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -57,8 +58,8 @@ public class MembersCourseNodeConfiguration extends AbstractCourseNodeConfigurat
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new MembersCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new MembersCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java b/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java
index aed0963e2b664c54e42dc677c76607340bf9520b..de15398c7d41a9dd8f269dfaf32c99cf990e2554 100644
--- a/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java
+++ b/src/main/java/org/olat/course/nodes/ms/MSAssessmentHandler.java
@@ -62,7 +62,8 @@ public class MSAssessmentHandler implements AssessmentHandler {
 
 	@Override
 	public AssessmentConfig getAssessmentConfig(CourseNode courseNode) {
-		courseNode.updateModuleConfigDefaults(false);
+		CourseNode parent = courseNode.getParent() instanceof CourseNode? (CourseNode)courseNode.getParent(): null;
+		courseNode.updateModuleConfigDefaults(false, parent);
 		return new MSAssessmentConfig(courseNode.getModuleConfiguration());
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/ms/MSCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/ms/MSCourseNodeConfiguration.java
index ca78aa8f17c2abca8012c412b2726d3f5a1dc338..17e3098dae5a3c5c41060f0e0b1e29f969907afa 100644
--- a/src/main/java/org/olat/course/nodes/ms/MSCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/ms/MSCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -42,8 +43,8 @@ public class MSCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new MSCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new MSCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/openmeetings/OpenMeetingsCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/openmeetings/OpenMeetingsCourseNodeConfiguration.java
index c5120dc82f76a979647ca06a3a076232ef314a68..7bfc7bd51ff069069be6350ac9db08e73a4becb0 100644
--- a/src/main/java/org/olat/course/nodes/openmeetings/OpenMeetingsCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/openmeetings/OpenMeetingsCourseNodeConfiguration.java
@@ -24,6 +24,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -58,10 +59,11 @@ public class OpenMeetingsCourseNodeConfiguration extends AbstractCourseNodeConfi
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new OpenMeetingsCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new OpenMeetingsCourseNode(parent);
 	}
 
+	@Override
 	public String getLinkText(Locale locale) {
 		Translator fallback = Util.createPackageTranslator(CourseNodeConfiguration.class, locale);
 		Translator translator = Util.createPackageTranslator(this.getClass(), locale, fallback);
diff --git a/src/main/java/org/olat/course/nodes/pf/PFCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/pf/PFCourseNodeConfiguration.java
index 5511d9a6f26f8386a1eb5c56f3761894e5dd6af2..ac0f56745a778587e365ca44a373029c6a58fc31 100644
--- a/src/main/java/org/olat/course/nodes/pf/PFCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/pf/PFCourseNodeConfiguration.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -50,8 +51,8 @@ public class PFCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new PFCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new PFCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeConfiguration.java
index a7bde225e3d34d6614fc3ad76f99ad107275dea9..9862341fed29de4004269cb13c9a7844a2e7bb11 100644
--- a/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/portfolio/PortfolioCourseNodeConfiguration.java
@@ -25,6 +25,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -67,8 +68,8 @@ public class PortfolioCourseNodeConfiguration extends AbstractCourseNodeConfigur
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new PortfolioCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new PortfolioCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerNodeConfiguration.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerNodeConfiguration.java
index 11858dc05912694c964a65e84121515a824ef640..7e0686beb452a6359c4ade44468957880f2297cd 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -41,8 +42,8 @@ import org.olat.course.nodes.ProjectBrokerCourseNode;
 public class ProjectBrokerNodeConfiguration extends AbstractCourseNodeConfiguration {
 
 	@Override
-	public CourseNode getInstance() {
-		return new ProjectBrokerCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new ProjectBrokerCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/scorm/ScormCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/scorm/ScormCourseNodeConfiguration.java
index fc7fbf39e11a71cc5d076e9b20a2f4941b388eb6..8361d180fb1834070028adf47df1dba99aedcb80 100644
--- a/src/main/java/org/olat/course/nodes/scorm/ScormCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/scorm/ScormCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -45,8 +46,8 @@ public class ScormCourseNodeConfiguration extends AbstractCourseNodeConfiguratio
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new ScormCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new ScormCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/sp/SPCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/sp/SPCourseNodeConfiguration.java
index dad54d929a3ebe73ed0e2433bfee5b9cc8011e2d..3e56a7fbc4af5ccfa3cc37847add6524bf04dcf3 100644
--- a/src/main/java/org/olat/course/nodes/sp/SPCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/sp/SPCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -42,8 +43,8 @@ public class SPCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new SPCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new SPCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/st/STCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/st/STCourseNodeConfiguration.java
index cc429584f9051afbcc7b060484aea56e4363a11b..34faf23bed8620502db2340246b8f36fa91e0272 100644
--- a/src/main/java/org/olat/course/nodes/st/STCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/st/STCourseNodeConfiguration.java
@@ -30,6 +30,7 @@ import java.util.Locale;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -45,8 +46,8 @@ public class STCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new STCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new STCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/st/STCourseNodeRunController.java b/src/main/java/org/olat/course/nodes/st/STCourseNodeRunController.java
index ada0fd7d4ebbae3af0dca16db115c8fa9f544b86..eda6c76a0f16209a4323583e6a76d67598410d82 100644
--- a/src/main/java/org/olat/course/nodes/st/STCourseNodeRunController.java
+++ b/src/main/java/org/olat/course/nodes/st/STCourseNodeRunController.java
@@ -144,6 +144,8 @@ public class STCourseNodeRunController extends BasicController {
 							// use the first children as they appear in the list
 							if (i < STCourseNodeConfiguration.MAX_PEEKVIEW_CHILD_NODES) {
 								if(accessible) {
+									CourseNode parent = child.getParent() instanceof CourseNode? (CourseNode)child.getParent(): null;
+									child.updateModuleConfigDefaults(false, parent);
 									childPeekViewController = child.createPeekViewRunController(ureq, wControl, userCourseEnv, childCourseTreeNode);
 								}
 							} else {
@@ -154,6 +156,8 @@ public class STCourseNodeRunController extends BasicController {
 							// Only add configured children
 							if (peekviewChildNodes.contains(child.getIdent())) {
 								if(accessible) {
+									CourseNode parent = child.getParent() instanceof CourseNode? (CourseNode)child.getParent(): null;
+									child.updateModuleConfigDefaults(false, parent);
 									childPeekViewController = child.createPeekViewRunController(ureq, wControl, userCourseEnv, childCourseTreeNode);
 								}
 							} else {
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 484f344fd29812b4620182b7574d4d07948655c1..70d519965f625adcb2ae2cbe858525db31675b10 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
@@ -23,6 +23,8 @@ import java.util.Date;
 
 import org.olat.course.learningpath.FullyAssessedTrigger;
 import org.olat.course.learningpath.LearningPathConfigs;
+import org.olat.course.nodes.STCourseNode;
+import org.olat.modules.ModuleConfiguration;
 import org.olat.modules.assessment.model.AssessmentEntryStatus;
 import org.olat.modules.assessment.model.AssessmentObligation;
 
@@ -34,6 +36,18 @@ import org.olat.modules.assessment.model.AssessmentObligation;
  */
 public class STLearningPathConfigs implements LearningPathConfigs {
 
+	private final ModuleConfiguration moduleConfigs;
+
+	public STLearningPathConfigs(ModuleConfiguration moduleConfigs) {
+		this.moduleConfigs = moduleConfigs;
+	}
+
+	@Override
+	public Boolean hasSequentialChildren() {
+		String sequenceConfig = moduleConfigs.getStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY);
+		return STCourseNode.CONFIG_LP_SEQUENCE_VALUE_SEQUENTIAL.equals(sequenceConfig);
+	}
+	
 	@Override
 	public Integer getDuration() {
 		return null;
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 7a2408693811874988f92e0591f8a307f258205c..14bbdd37b4de1ec9649f3d7034a6f1bcd7de05db 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
@@ -39,8 +39,6 @@ import org.springframework.stereotype.Service;
 @Service
 public class STLearningPathNodeHandler implements LearningPathNodeHandler {
 
-	private static final STLearningPathConfigs LEARNING_PATH_CONFIGS = new STLearningPathConfigs();
-
 	@Override
 	public String acceptCourseNodeType() {
 		return STCourseNode.TYPE;
@@ -53,7 +51,7 @@ public class STLearningPathNodeHandler implements LearningPathNodeHandler {
 
 	@Override
 	public LearningPathConfigs getConfigs(CourseNode courseNode) {
-		return LEARNING_PATH_CONFIGS;
+		return new STLearningPathConfigs(courseNode.getModuleConfiguration());
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/survey/SurveyCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/survey/SurveyCourseNodeConfiguration.java
index bd73ab15dc3f3685f729c3c35a34598023ae262a..f49b6f528090e1acdebecd1b888e09980239e84d 100644
--- a/src/main/java/org/olat/course/nodes/survey/SurveyCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/survey/SurveyCourseNodeConfiguration.java
@@ -23,6 +23,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeGroup;
@@ -48,8 +49,8 @@ public class SurveyCourseNodeConfiguration extends AbstractCourseNodeConfigurati
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new SurveyCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new SurveyCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/ta/TACourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/ta/TACourseNodeConfiguration.java
index 83d1d605381c21722f436980d1c135e1f3a11fdb..7139b7b301a27fdb92fa7397bdc80686226676fb 100644
--- a/src/main/java/org/olat/course/nodes/ta/TACourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/ta/TACourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -45,8 +46,8 @@ public class TACourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new TACourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new TACourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/tu/TUCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/tu/TUCourseNodeConfiguration.java
index 4b46e221666d913b940c0de720a82a00ae3973bf..2bb232bba0198893e114a1ff06815d44bbf48212 100644
--- a/src/main/java/org/olat/course/nodes/tu/TUCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/tu/TUCourseNodeConfiguration.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -47,7 +48,7 @@ public class TUCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
 	}
 
 	@Override
-	public CourseNode getInstance() {
+	public CourseNode getInstance(INode parent) {
 		return new TUCourseNode();
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/video/VideoCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/video/VideoCourseNodeConfiguration.java
index 1fc5dee30424f7986c09d58ab3f322c617f4b0a3..d5e15d9c31eaa4c563742236c00fc10244d26916 100644
--- a/src/main/java/org/olat/course/nodes/video/VideoCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/video/VideoCourseNodeConfiguration.java
@@ -24,6 +24,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -44,8 +45,8 @@ public class VideoCourseNodeConfiguration  extends AbstractCourseNodeConfigurati
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new VideoCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new VideoCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/vitero/ViteroCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/vitero/ViteroCourseNodeConfiguration.java
index b6242699184ac8f5d5a8e265e2512bd7499738dd..68d65ec6767c1908515b878e0f4578ac6ad3499a 100644
--- a/src/main/java/org/olat/course/nodes/vitero/ViteroCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/vitero/ViteroCourseNodeConfiguration.java
@@ -24,6 +24,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -58,8 +59,8 @@ public class ViteroCourseNodeConfiguration extends AbstractCourseNodeConfigurati
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new ViteroCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new ViteroCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/wiki/WikiCourseNodeConfiguration.java b/src/main/java/org/olat/course/nodes/wiki/WikiCourseNodeConfiguration.java
index 8202112d56b75c651f901864fe4f1b8ad829a782..6e544f465976074096bca0a4071979a1326a3dea 100644
--- a/src/main/java/org/olat/course/nodes/wiki/WikiCourseNodeConfiguration.java
+++ b/src/main/java/org/olat/course/nodes/wiki/WikiCourseNodeConfiguration.java
@@ -30,6 +30,7 @@ import java.util.Locale;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
+import org.olat.core.util.nodes.INode;
 import org.olat.course.nodes.AbstractCourseNodeConfiguration;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
@@ -50,8 +51,8 @@ public class WikiCourseNodeConfiguration extends AbstractCourseNodeConfiguration
 	}
 
 	@Override
-	public CourseNode getInstance() {
-		return new WikiCourseNode();
+	public CourseNode getInstance(INode parent) {
+		return new WikiCourseNode(parent);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/course/run/navigation/NavigationHandler.java b/src/main/java/org/olat/course/run/navigation/NavigationHandler.java
index 2c611d47b84a99a4991bac841da48558faecdcba..376a2307c823b8fb25f8b861faaef6076ba456b6 100644
--- a/src/main/java/org/olat/course/run/navigation/NavigationHandler.java
+++ b/src/main/java/org/olat/course/run/navigation/NavigationHandler.java
@@ -210,6 +210,8 @@ public class NavigationHandler implements Disposable {
 				final OLATResourceable ores = OresHelper.createOLATResourceableInstance(CourseNode.class, Long.parseLong(internCourseNode.getIdent()));
 				ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(ores);
 				WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ce, wControl);
+				CourseNode parent = internCourseNode.getParent() instanceof CourseNode? (CourseNode)internCourseNode.getParent(): null;
+				internCourseNode.updateModuleConfigDefaults(false, parent);
 				nrcr = internCourseNode.createNodeRunConstructionResult(ureq, bwControl, userCourseEnv, internNode, nodecmd);
 				// remember as instance variable for next click
 				subtreemodelListener = nrcr.getSubTreeListener();
@@ -402,6 +404,8 @@ public class NavigationHandler implements Disposable {
 						}
 					}
 					
+					CourseNode parent = courseNode.getParent() instanceof CourseNode? (CourseNode)courseNode.getParent(): null;
+					courseNode.updateModuleConfigDefaults(false, parent);
 					ncr = courseNode.createNodeRunConstructionResult(ureq, bwControl, userCourseEnv, newCalledTreeNode, nodecmd);
 
 					// remember as instance variable for next click
diff --git a/src/main/java/org/olat/login/oauth/spi/JSONWebToken.java b/src/main/java/org/olat/login/oauth/spi/JSONWebToken.java
index 37410557a14e8d2fdff5143a49c698685537622a..e64b094b32d7fafdd9e31a539b11e5f290e1a251 100644
--- a/src/main/java/org/olat/login/oauth/spi/JSONWebToken.java
+++ b/src/main/java/org/olat/login/oauth/spi/JSONWebToken.java
@@ -19,6 +19,9 @@
  */
 package org.olat.login.oauth.spi;
 
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
 import org.apache.logging.log4j.Logger;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -60,40 +63,48 @@ public class JSONWebToken {
 	}
 
 	public static JSONWebToken parse(OAuth2AccessToken token) throws JSONException {
+		return parse(token.getAccessToken());
+	}
+
+	public static JSONWebToken parse(String accessToken) throws JSONException {
 		try {
-			String accessToken= token.getAccessToken();
-			
 			int firstIndex = accessToken.indexOf('.');
 			int secondIndex = accessToken.indexOf('.', firstIndex + 1);
-			
 			String header = StringHelper.decodeBase64(accessToken.substring(0, firstIndex));
-			String payload = StringHelper.decodeBase64(accessToken.substring(firstIndex, secondIndex));
+			String payload = decodeBase64(accessToken.substring(firstIndex + 1, secondIndex));
 			JSONObject jsonPayload = new JSONObject(payload);
 			return new JSONWebToken(header, payload, jsonPayload);
 		} catch (JSONException e) {
-			log.error("Cannot parse token: {}", token.getAccessToken());
+			log.error("Cannot parse token: {}", accessToken);
 			throw e;
 		} catch (Exception e) {
-			log.error("Cannot parse token: {}", token.getAccessToken());
+			log.error("Cannot parse token: {}", accessToken);
 			throw new JSONException(e);
 		}
 	}
 	
-	public static JSONWebToken parse(String accessToken) throws JSONException {
+	/**
+	 * The method try 2 different way to decode the content and check
+	 * that we can parse the JSON content.
+	 * 
+	 * @param content The content to decode
+	 * @return The decoded string
+	 * @throws Exception
+	 */
+	private static final String decodeBase64(String content) throws Exception {
 		try {
-			int firstIndex = accessToken.indexOf('.');
-			int secondIndex = accessToken.indexOf('.', firstIndex + 1);
-			
-			String header = StringHelper.decodeBase64(accessToken.substring(0, firstIndex));
-			String payload = StringHelper.decodeBase64(accessToken.substring(firstIndex, secondIndex));
-			JSONObject jsonPayload = new JSONObject(payload);
-			return new JSONWebToken(header, payload, jsonPayload);
+			String decodedContent = StringHelper.decodeBase64(content);
+			new JSONObject(decodedContent);
+			return decodedContent;
 		} catch (JSONException e) {
-			log.error("Cannot parse token: {}", accessToken);
-			throw e;
-		} catch (Exception e) {
-			log.error("Cannot parse token: {}", accessToken);
-			throw new JSONException(e);
+			try {
+				byte[] contentBytes = Base64.getUrlDecoder().decode(content);
+				String decodedContent = new String(contentBytes, StandardCharsets.UTF_8);
+				new JSONObject(decodedContent);
+				return decodedContent;
+			} catch (Exception e1) {
+				throw e;
+			}
 		}
 	}
 }
diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java
index 10aa1a5aed1ad0b2dd3a9f5244917346a4dc50dd..67bd43eb7c84b6b5b46347547e07ec81f1782a94 100644
--- a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java
+++ b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java
@@ -61,6 +61,7 @@ import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.FOCourseNode;
 import org.olat.course.properties.CoursePropertyManager;
 import org.olat.course.run.userview.CourseTreeVisitor;
+import org.olat.course.tree.CourseEditorTreeNode;
 import org.olat.modules.ModuleConfiguration;
 import org.olat.modules.fo.Forum;
 import org.olat.modules.fo.Message;
@@ -464,13 +465,13 @@ public class ForumCourseNodeWebService extends AbstractCourseNodeWebService {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 
-		CourseNode courseNode = getParentNode(course, nodeId);
-		if(courseNode == null) {
+		CourseEditorTreeNode parentNode = getParentNode(course, nodeId);
+		if(parentNode == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 		
 		CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
-		Property forumKeyProp = cpm.findCourseNodeProperty(courseNode, null, null, FOCourseNode.CONFIG_FORUM_KEY);
+		Property forumKeyProp = cpm.findCourseNodeProperty(parentNode.getCourseNode(), null, null, FOCourseNode.CONFIG_FORUM_KEY);
 		Forum forum = null;
 		if(forumKeyProp!=null) {
       // Forum does already exist, load forum with key from properties
diff --git a/src/main/java/org/olat/modules/forms/EvaluationFormManager.java b/src/main/java/org/olat/modules/forms/EvaluationFormManager.java
index b29bac8fd691e11c94ac4084b52f0f300f9cc72f..7040f63670449bcce9347318935438aa2f8c7330 100644
--- a/src/main/java/org/olat/modules/forms/EvaluationFormManager.java
+++ b/src/main/java/org/olat/modules/forms/EvaluationFormManager.java
@@ -34,6 +34,8 @@ import org.olat.modules.forms.model.jpa.EvaluationFormResponses;
 import org.olat.modules.forms.model.xml.AbstractElement;
 import org.olat.modules.forms.model.xml.Form;
 import org.olat.modules.forms.model.xml.Rubric;
+import org.olat.modules.forms.ui.model.CountRatioResult;
+import org.olat.modules.forms.ui.model.CountResult;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryRef;
 
@@ -235,5 +237,7 @@ public interface EvaluationFormManager {
 	public RubricStatistic getRubricStatistic(Rubric rubric, SlidersStatistic slidersStatistic);
 	
 	public RubricRating getRubricRating(Rubric rubric, Double value);
+	
+	public List<CountRatioResult> calculateRatio(List<CountResult> countResults);
 
 }
diff --git a/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java b/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java
index 9c7dbfeef06770e82ec51927d57b980a77b7e3a9..3b37dc2ab2ba1f124d983fd33f469786d3867f66 100644
--- a/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java
+++ b/src/main/java/org/olat/modules/forms/manager/EvaluationFormManagerImpl.java
@@ -76,6 +76,8 @@ import org.olat.modules.forms.model.xml.Form;
 import org.olat.modules.forms.model.xml.FormXStream;
 import org.olat.modules.forms.model.xml.Rubric;
 import org.olat.modules.forms.model.xml.Slider;
+import org.olat.modules.forms.ui.model.CountRatioResult;
+import org.olat.modules.forms.ui.model.CountResult;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryRef;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -580,4 +582,19 @@ public class EvaluationFormManagerImpl implements EvaluationFormManager {
 	public RubricRating getRubricRating(Rubric rubric, Double value) {
 		return RubricRatingEvaluator.rate(rubric, value);
 	}
+
+	@Override
+	public List<CountRatioResult> calculateRatio(List<CountResult> countResults) {
+		if (countResults == null || countResults.isEmpty()) return new ArrayList<>(0);
+		
+		long sum = countResults.stream().mapToLong(CountResult::getCount).sum();
+		if (sum == 0) return new ArrayList<>(0);
+		
+		List<CountRatioResult> ratios = new ArrayList<>(countResults.size());
+		for (CountResult countResult : countResults) {
+			double ratio = (double)countResult.getCount() / sum;
+			ratios.add(new CountRatioResult(countResult, ratio));
+		}
+		return ratios;
+	}
 }
diff --git a/src/main/java/org/olat/modules/forms/ui/CountDataModel.java b/src/main/java/org/olat/modules/forms/ui/CountDataModel.java
index a81a9c8de0ab0a46232fc33a23f3955b01313f8a..1069ac244079dc6df1b3aaa59cf772647a846dca 100644
--- a/src/main/java/org/olat/modules/forms/ui/CountDataModel.java
+++ b/src/main/java/org/olat/modules/forms/ui/CountDataModel.java
@@ -27,7 +27,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSorta
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate;
-import org.olat.modules.forms.ui.model.CountResult;
+import org.olat.modules.forms.ui.model.CountRatioResult;
 
 /**
  * 
@@ -35,8 +35,8 @@ import org.olat.modules.forms.ui.model.CountResult;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class CountDataModel extends DefaultFlexiTableDataModel<CountResult>
-implements SortableFlexiTableDataModel<CountResult> {
+public class CountDataModel extends DefaultFlexiTableDataModel<CountRatioResult>
+implements SortableFlexiTableDataModel<CountRatioResult> {
 	
 	public CountDataModel(FlexiTableColumnModel columnsModel) {
 		super(columnsModel);
@@ -44,33 +44,35 @@ implements SortableFlexiTableDataModel<CountResult> {
 
 	@Override
 	public void sort(SortKey orderBy) {
-		List<CountResult> rows = new SortableFlexiTableModelDelegate<>(orderBy, this, null).sort();
+		List<CountRatioResult> rows = new SortableFlexiTableModelDelegate<>(orderBy, this, null).sort();
 		super.setObjects(rows);
 	}
 
 	@Override
 	public Object getValueAt(int row, int col) {
-		CountResult countResult = getObject(row);
+		CountRatioResult countResult = getObject(row);
 		return getValueAt(countResult, col);
 	}
 
 	@Override
-	public Object getValueAt(CountResult row, int col) {
+	public Object getValueAt(CountRatioResult row, int col) {
 		switch(CountReportCols.values()[col]) {
 			case name: return row.getName();
 			case count: return row.getCount();
+			case percent: return row.getRatio();
 			default: return null;
 		}
 	}
 
 	@Override
-	public DefaultFlexiTableDataModel<CountResult> createCopyWithEmptyList() {
+	public DefaultFlexiTableDataModel<CountRatioResult> createCopyWithEmptyList() {
 		return new CountDataModel(getTableColumnModel());
 	}
 	
 	public enum CountReportCols implements FlexiSortableColumnDef {
 		name("report.count.name.title"),
-		count("report.count.count.title");
+		count("report.count.count.title"),
+		percent("report.count.percent.title");
 		
 		private final String i18nKey;
 		
diff --git a/src/main/java/org/olat/modules/forms/ui/CountTableController.java b/src/main/java/org/olat/modules/forms/ui/CountTableController.java
index 7b2a4db62f6fd42664c9c00a02bc0493d88a9de3..41f1689a49e43dfdf7188c29f73d9497ccfecb23 100644
--- a/src/main/java/org/olat/modules/forms/ui/CountTableController.java
+++ b/src/main/java/org/olat/modules/forms/ui/CountTableController.java
@@ -19,18 +19,25 @@
  */
 package org.olat.modules.forms.ui;
 
+import java.util.List;
+
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.CodeHelper;
+import org.olat.modules.forms.EvaluationFormManager;
 import org.olat.modules.forms.ui.CountDataModel.CountReportCols;
+import org.olat.modules.forms.ui.component.PercentCellRenderer;
 import org.olat.modules.forms.ui.model.CountDataSource;
+import org.olat.modules.forms.ui.model.CountRatioResult;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -41,6 +48,9 @@ import org.olat.modules.forms.ui.model.CountDataSource;
 public class CountTableController extends FormBasicController {
 	
 	private final CountDataSource dataSource;
+	
+	@Autowired
+	private EvaluationFormManager evaluationFormManager;
 
 	public CountTableController(UserRequest ureq, WindowControl wControl, CountDataSource dataSource) {
 		super(ureq, wControl, LAYOUT_HORIZONTAL);
@@ -52,10 +62,19 @@ public class CountTableController extends FormBasicController {
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CountReportCols.name));
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CountReportCols.count));
+		DefaultFlexiColumnModel countModel = new DefaultFlexiColumnModel(CountReportCols.count);
+		countModel.setAlignment(FlexiColumnModel.ALIGNMENT_RIGHT);
+		countModel.setHeaderAlignment(FlexiColumnModel.ALIGNMENT_RIGHT);
+		columnsModel.addFlexiColumnModel(countModel);
+		DefaultFlexiColumnModel percentModel = new DefaultFlexiColumnModel(CountReportCols.percent, new PercentCellRenderer());
+		percentModel.setAlignment(FlexiColumnModel.ALIGNMENT_RIGHT);
+		percentModel.setHeaderAlignment(FlexiColumnModel.ALIGNMENT_RIGHT);
+		columnsModel.addFlexiColumnModel(percentModel);
 		
 		CountDataModel dataModel = new CountDataModel(columnsModel);
-		dataModel.setObjects(dataSource.getResponses());
+		
+		List<CountRatioResult> calculateRatio = evaluationFormManager.calculateRatio(dataSource.getResponses());
+		dataModel.setObjects(calculateRatio);
 		FlexiTableElement tableEl = uifactory.addTableElement(getWindowControl(),
 				"counts" + CodeHelper.getRAMUniqueID(), dataModel, getTranslator(), formLayout);
 		tableEl.setNumOfRowsEnabled(false);
diff --git a/src/main/java/org/olat/modules/forms/ui/EvaluationFormOverviewController.java b/src/main/java/org/olat/modules/forms/ui/EvaluationFormOverviewController.java
index 85c463f89ad35534060e5b48c1a43b0c616ff66a..eea6ea73cb13bb88acbef8ab42818c15db7969bf 100644
--- a/src/main/java/org/olat/modules/forms/ui/EvaluationFormOverviewController.java
+++ b/src/main/java/org/olat/modules/forms/ui/EvaluationFormOverviewController.java
@@ -76,18 +76,25 @@ public class EvaluationFormOverviewController extends BasicController {
 		EvaluationFormStatistic statistic = evaluationFormManager.getSessionsStatistic(filter);
 		
 		long numOfDoneSessions = statistic.getNumOfDoneSessions();
-		String numberSessions;
 		if (figures != null && figures.getNumberOfParticipations() != null) {
+			double percent = figures.getNumberOfParticipations() > 0
+					? (double)numOfDoneSessions / figures.getNumberOfParticipations() * 100.0d
+					: 0.0;
+			long percentRounded = Math.round(percent);
+			
 			String[] args = new String[] {
 					String.valueOf(numOfDoneSessions),
-					String.valueOf(figures.getNumberOfParticipations())
+					String.valueOf(figures.getNumberOfParticipations()),
+					String.valueOf(percentRounded)
 			};
-			numberSessions = translate("report.overview.figures.number.done.session.of", args);
+			String numberSessions = translate("report.overview.figures.number.done.session.of", args);
+			allFigures.add(new Figure(translate("report.overview.figures.number.done.session.percent"),
+					numberSessions));
 		} else {
-			numberSessions = String.valueOf(numOfDoneSessions);
+			String numberSessions = String.valueOf(numOfDoneSessions);
+			allFigures.add(new Figure(translate("report.overview.figures.number.done.session"),
+					numberSessions));
 		}
-		allFigures.add(new Figure(translate("report.overview.figures.number.done.session"),
-				numberSessions));
 
 		String submissionPeriod = EvaluationFormFormatter.period(statistic.getFirstSubmission(),
 				statistic.getLastSubmission(), getLocale());
diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties
index a2e7c705d9738e4f0d5a95d2950c6c397f9cae5f..4e6c527a475293fd7213398721937e7b60f61950 100644
--- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties
@@ -67,6 +67,7 @@ no.response=Keine Antwort m\u00F6glich
 report.anonymous.user=Anonym
 report.count.count.title=Anzahl
 report.count.name.title=Wert
+report.count.percent.title=%
 report.excel.legend=Legende
 report.excel.text=Text
 report.export=Export Excel
@@ -75,7 +76,8 @@ report.overview.duration.count=Anzahl
 report.overview.duration.title=Bearbeitungsdauer
 report.overview.duration=Bearbeitungsdauer
 report.overview.figures.average.duration=Durchschnittliche Bearbeitungsdauer
-report.overview.figures.number.done.session.of={0} von {1}
+report.overview.figures.number.done.session.of={0} von {1} / {2}%
+report.overview.figures.number.done.session.percent=$\:report.overview.figures.number.done.session / R\u00FCcklaufquote
 report.overview.figures.number.done.session=Anzahl Teilnehmer
 report.overview.figures.submission.period=Abgabezeitraum
 report.overview.figures.title=Kennzahlen
diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties
index ad67fe4624ccfe05510937b81d9f306cb3ff6a8a..277410b7e300a30c6cafaeba7ea73b3f90e57a81 100644
--- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties
@@ -66,6 +66,7 @@ no.response=No answer
 report.anonymous.user=Anonymous
 report.count.count.title=Count
 report.count.name.title=Value
+report.count.percent.title=%
 report.excel.legend=Legend
 report.excel.text=Text
 report.export=Export Excel
@@ -74,7 +75,8 @@ report.overview.duration.count=Count
 report.overview.duration.title=Duration
 report.overview.duration=Duration
 report.overview.figures.average.duration=Average duration
-report.overview.figures.number.done.session.of={0} of {1}
+report.overview.figures.number.done.session.of={0} of {1} / {2}%
+report.overview.figures.number.done.session.percent=$\:report.overview.figures.number.done.session / Return rate
 report.overview.figures.number.done.session=Number of participants
 report.overview.figures.submission.period=Submission period
 report.overview.figures.title=Figures
diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties
index 7e252e809ddbafeddc5ebd12adde6b444a501365..006807445bb8d29ba9035b643df8aa9cbb8be942 100644
--- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_fr.properties
@@ -75,7 +75,7 @@ report.overview.duration.count=Nombre
 report.overview.duration.title=Dur\u00E9e
 report.overview.figures.average.duration=Dur\u00E9e moyenne
 report.overview.figures.number.done.session=Nombre de participants
-report.overview.figures.number.done.session.of={0} sur {1}
+report.overview.figures.number.done.session.of={0} sur {1} / {2}%
 report.overview.figures.submission.period=P\u00E9riode de soumission
 report.overview.figures.title=Indicateurs
 report.overview.total.title=Total rubriques
diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties
index 33a686e554426ce5079881ffaae2c79c18c99e41..d14261aa1f995442d9cb52bb37d6ed31179b21a6 100644
--- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_pt_BR.properties
@@ -76,7 +76,7 @@ report.overview.duration.count=Contagem
 report.overview.duration.title=Dura\u00E7\u00E3o
 report.overview.figures.average.duration=Dura\u00E7\u00E3o m\u00E9dia
 report.overview.figures.number.done.session=N\u00FAmero de participantes
-report.overview.figures.number.done.session.of={0} de {1}
+report.overview.figures.number.done.session.of={0} de {1} / {2}%
 report.overview.figures.submission.period=Per\u00EDodo de Submiss\u00E3o
 report.overview.figures.title=N\u00FAmeros-chave
 report.overview.total.title=Rubricas totais
diff --git a/src/main/java/org/olat/modules/forms/ui/component/PercentCellRenderer.java b/src/main/java/org/olat/modules/forms/ui/component/PercentCellRenderer.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0f11c7dc873454d0823754660e9189651d1323d
--- /dev/null
+++ b/src/main/java/org/olat/modules/forms/ui/component/PercentCellRenderer.java
@@ -0,0 +1,46 @@
+/**
+ * <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.modules.forms.ui.component;
+
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent;
+import org.olat.core.gui.render.Renderer;
+import org.olat.core.gui.render.StringOutput;
+import org.olat.core.gui.render.URLBuilder;
+import org.olat.core.gui.translator.Translator;
+
+/**
+ * 
+ * Initial date: 05.02.2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class PercentCellRenderer implements FlexiCellRenderer {
+
+	@Override
+	public void render(Renderer renderer, StringOutput target, Object cellValue, int row, FlexiTableComponent source,
+			URLBuilder ubu, Translator translator) {
+		if(cellValue instanceof Double) {
+			double percent = ((Double)cellValue).doubleValue() * 100.0d;
+			long rounded = Math.round(percent);
+			target.append(rounded).append("%");
+		}
+	}
+}
diff --git a/src/main/java/org/olat/modules/forms/ui/model/CountRatioResult.java b/src/main/java/org/olat/modules/forms/ui/model/CountRatioResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..861ccbd7ebb5f19b8d70f4d63998f102f9724ab3
--- /dev/null
+++ b/src/main/java/org/olat/modules/forms/ui/model/CountRatioResult.java
@@ -0,0 +1,41 @@
+/**
+ * <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.modules.forms.ui.model;
+
+/**
+ * 
+ * Initial date: 5 Feb 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class CountRatioResult extends CountResult {
+
+	private final Double ratio;
+
+	public CountRatioResult(CountResult countResult, Double ratio) {
+		super(countResult.getName(), countResult.getCount());
+		this.ratio = ratio;
+	}
+
+	public Double getRatio() {
+		return ratio;
+	}
+
+}
diff --git a/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java b/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java
index f1a438cb50b4a96dd9d9ad99bb101134736f7c08..6c514a358a84f590e963297a1eb870d36619df56 100644
--- a/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java
@@ -105,7 +105,7 @@ public abstract class AbstractCourseNodeWebService {
 			if(nodeId != null) {
 				node = updateCourseNode(nodeId, shortTitle, longTitle, objectives, visibilityExpertRules, accessExpertRules, config, editSession);
 			} else {
-				CourseNode parentNode = getParentNode(course, parentNodeId);
+				CourseEditorTreeNode parentNode = getParentNode(course, parentNodeId);
 				if(parentNode == null) {
 					return Response.serverError().status(Status.NOT_FOUND).build();
 				}
@@ -131,7 +131,7 @@ public abstract class AbstractCourseNodeWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
-		CourseNode courseNode = getParentNode(course, nodeId);
+		CourseNode courseNode = getParentNode(course, nodeId).getCourseNode();
 		if(courseNode == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
@@ -159,10 +159,10 @@ public abstract class AbstractCourseNodeWebService {
 	
 	private CourseNodeVO createCourseNode(String type, String shortTitle, String longTitle, String learningObjectives,
 			String visibilityExpertRules, String accessExpertRules, CustomConfigDelegate delegateConfig,
-			CourseEditSession editSession, CourseNode parentNode, Integer position) {
+			CourseEditSession editSession, CourseEditorTreeNode parentNode, Integer position) {
 
 		CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration(type);
-		CourseNode insertedNode = newNodeConfig.getInstance();
+		CourseNode insertedNode = newNodeConfig.getInstance(parentNode);
 		insertedNode.setShortTitle(shortTitle);
 		insertedNode.setLongTitle(longTitle);
 		insertedNode.setLearningObjectives(learningObjectives);
@@ -185,9 +185,9 @@ public abstract class AbstractCourseNodeWebService {
 		}
 
 		if (position == null || position.intValue() < 0) {
-			course.getEditorTreeModel().addCourseNode(insertedNode, parentNode);
+			course.getEditorTreeModel().addCourseNode(insertedNode, parentNode.getCourseNode());
 		} else {
-			course.getEditorTreeModel().insertCourseNodeAt(insertedNode, parentNode, position);
+			course.getEditorTreeModel().insertCourseNodeAt(insertedNode, parentNode.getCourseNode(), position);
 		}
 		
 		CourseEditorTreeNode editorNode = course.getEditorTreeModel().getCourseEditorNodeContaining(insertedNode);
@@ -243,12 +243,15 @@ public abstract class AbstractCourseNodeWebService {
 		return cond;
 	}
 	
-	protected CourseNode getParentNode(ICourse course, String parentNodeId) {
+	protected CourseEditorTreeNode getParentNode(ICourse course, String parentNodeId) {
 		if (parentNodeId == null) {
-			return course.getRunStructure().getRootNode();
-		} else {
-			return course.getEditorTreeModel().getCourseNode(parentNodeId);
+			return (CourseEditorTreeNode)course.getEditorTreeModel().getRootNode();
+		}
+		TreeNode treeNode = course.getEditorTreeModel().getNodeById(parentNodeId);
+		if (treeNode instanceof CourseEditorTreeNode) {
+			return (CourseEditorTreeNode) treeNode;
 		}
+		return null;
 	}
 	
 	private void saveAndCloseCourse(CourseEditSession editSession) {
diff --git a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
index b786c20163946c2fca37c1d8d62e873df8530241..a7ec4d5651cffe415fe8687976acd780aa505148 100644
--- a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
@@ -21,7 +21,6 @@
 package org.olat.restapi.repository.course;
 
 import java.io.File;
-
 import java.io.FileInputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -69,6 +68,7 @@ import org.olat.course.nodes.sp.SPEditController;
 import org.olat.course.nodes.st.STCourseNodeEditController;
 import org.olat.course.nodes.ta.TaskController;
 import org.olat.course.nodes.tu.TUConfigForm;
+import org.olat.course.tree.CourseEditorTreeNode;
 import org.olat.ims.qti.process.AssessmentInstance;
 import org.olat.modules.ModuleConfiguration;
 import org.olat.repository.RepositoryEntry;
@@ -156,12 +156,12 @@ public class CourseElementWebService extends AbstractCourseNodeWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 
-		CourseNode courseNode = getParentNode(course, nodeId);
-		if(courseNode == null) {
+		CourseEditorTreeNode parentNode = getParentNode(course, nodeId);
+		if(parentNode == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
 		
-		CourseNodeVO vo = ObjectFactory.get(courseNode);
+		CourseNodeVO vo = ObjectFactory.get(parentNode.getCourseNode());
 		return Response.ok(vo).build();
 	}
 	
@@ -1577,13 +1577,13 @@ public class CourseElementWebService extends AbstractCourseNodeWebService {
 	public Response attachTaskFile(@PathParam("courseId") Long courseId, @PathParam("nodeId") String nodeId,
 			@Context HttpServletRequest request) {
 			ICourse course = CoursesWebService.loadCourse(courseId);
-	CourseNode node = getParentNode(course, nodeId);
+		CourseEditorTreeNode parentNode = getParentNode(course, nodeId);
 		if(course == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
 		}
-		if(node == null) {
+		if(parentNode == null) {
 			return Response.serverError().status(Status.NOT_FOUND).build();
-		} else if(!(node instanceof TACourseNode)) {
+		} else if(!(parentNode.getCourseNode() instanceof TACourseNode)) {
 			return Response.serverError().status(Status.NOT_ACCEPTABLE).build();
 		}
 		if (!isAuthorEditor(course, request)) {
@@ -1595,7 +1595,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService {
 		try {
 			reader = new MultipartReader(request);
 			String filename = reader.getValue("filename", "task");
-			String taskFolderPath = TACourseNode.getTaskFolderPathRelToFolderRoot(course, node);
+			String taskFolderPath = TACourseNode.getTaskFolderPathRelToFolderRoot(course, parentNode.getCourseNode());
 			VFSContainer taskFolder = VFSManager.olatRootContainer(taskFolderPath, null);
 			VFSLeaf singleFile = (VFSLeaf) taskFolder.resolve("/" + filename);
 			if (singleFile == null) {
@@ -1833,7 +1833,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService {
 		}
 
 		TaskConfigVO config = new TaskConfigVO();
-		CourseNode courseNode = getParentNode(course, nodeId);
+		CourseNode courseNode = getParentNode(course, nodeId).getCourseNode();
 		ModuleConfiguration moduleConfig = courseNode.getModuleConfiguration();
 		//build configuration with fallback to default values
 		Boolean isAssignmentEnabled = (Boolean)moduleConfig.get(TACourseNode.CONF_TASK_ENABLED);
@@ -2029,7 +2029,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService {
 		}
 
 		SurveyConfigVO config = new SurveyConfigVO();
-		CourseNode courseNode = getParentNode(course, nodeId);
+		CourseNode courseNode = getParentNode(course, nodeId).getCourseNode();
 		ModuleConfiguration moduleConfig = courseNode.getModuleConfiguration();
 		//build configuration with fallback to default values
 		Boolean allowCancel = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_ENABLECANCEL);
@@ -2214,7 +2214,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService {
 		
 		TestConfigVO config = new TestConfigVO();
 		ICourse course = CoursesWebService.loadCourse(courseId);
-		CourseNode courseNode = getParentNode(course, nodeId);
+		CourseNode courseNode = getParentNode(course, nodeId).getCourseNode();
 		//build configuration with fallback to default values
 		ModuleConfiguration moduleConfig = courseNode.getModuleConfiguration();
 		Boolean allowCancel = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_ENABLECANCEL);
@@ -2685,7 +2685,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService {
 
 		@Override
 		public void configure(ICourse course, CourseNode newNode, ModuleConfiguration moduleConfig) {
-			newNode.updateModuleConfigDefaults(true);
+			newNode.updateModuleConfigDefaults(true, null);
 			//fxdiff FXOLAT-122: course management
 			if(text != null) {
 				moduleConfig.set(TACourseNode.CONF_TASK_TEXT, text);
diff --git a/src/test/java/org/olat/course/learningpath/LearningPathServiceTest.java b/src/test/java/org/olat/course/learningpath/LearningPathServiceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..0b864152ddf983d07d70cf9bcd075977451e3d09
--- /dev/null
+++ b/src/test/java/org/olat/course/learningpath/LearningPathServiceTest.java
@@ -0,0 +1,111 @@
+/**
+ * <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 org.assertj.core.api.SoftAssertions;
+import org.junit.Test;
+import org.olat.course.nodes.CourseNode;
+import org.olat.course.nodes.CourseNodeFactory;
+import org.olat.course.nodes.STCourseNode;
+import org.olat.test.OlatTestCase;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 6 Feb 2020<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class LearningPathServiceTest extends OlatTestCase {
+	
+	@Autowired
+	private LearningPathService sut;
+	
+	@Test
+	public void shouldGetSequenceConfig() {
+		CourseNode root = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(null);
+		root.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_WITHOUT);
+		
+		CourseNode sp_0_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("sp").getInstance(root);
+		root.addChild(sp_0_1);
+		
+		CourseNode st1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(root);
+		st1.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_SEQUENTIAL);
+		root.addChild(st1);
+		CourseNode sp_1_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("sp").getInstance(st1);
+		st1.addChild(sp_1_1);
+		CourseNode sp_1_2 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("sp").getInstance(st1);
+		st1.addChild(sp_1_2);
+		CourseNode sp_1_2_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("sp").getInstance(sp_1_2);
+		sp_1_2.addChild(sp_1_2_1);
+		
+		CourseNode st2 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(root);
+		st2.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_WITHOUT);
+		root.addChild(st2);
+		CourseNode st2_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(st2);
+		st2_1.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_WITHOUT);
+		st2.addChild(st2_1);
+		CourseNode st2_1_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(st2_1);
+		st2_1_1.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_SEQUENTIAL);
+		st2_1.addChild(st2_1_1);
+		CourseNode sp2_1_1_1 = CourseNodeFactory.getInstance().getCourseNodeConfiguration("sp").getInstance(st2_1_1);
+		st2_1_1.addChild(sp2_1_1_1);
+		
+		SoftAssertions softly = new SoftAssertions();
+		softly.assertThat(sut.getSequenceConfig(root).isInSequence()).as("root in").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(root).hasSequentialChildren()).as("root children").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(sp_0_1).isInSequence()).as("sp1 in").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(sp_0_1).hasSequentialChildren()).as("sp1 children").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(st1).isInSequence()).as("st1 in").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(st1).hasSequentialChildren()).as("st1 children").isEqualTo(true);
+		softly.assertThat(sut.getSequenceConfig(sp_1_1).isInSequence()).as("sp_1_1 in").isEqualTo(true);
+		softly.assertThat(sut.getSequenceConfig(sp_1_1).hasSequentialChildren()).as("sp_1_1 children").isEqualTo(true);
+		softly.assertThat(sut.getSequenceConfig(sp_1_2).isInSequence()).as("sp_1_2 in").isEqualTo(true);
+		softly.assertThat(sut.getSequenceConfig(sp_1_2).hasSequentialChildren()).as("sp_1_2 children").isEqualTo(true);
+		softly.assertThat(sut.getSequenceConfig(sp_1_2_1).isInSequence()).as("sp_1_2_1 in").isEqualTo(true);
+		softly.assertThat(sut.getSequenceConfig(sp_1_2_1).hasSequentialChildren()).as("sp_1_2_1 children").isEqualTo(true);
+		softly.assertThat(sut.getSequenceConfig(st2).isInSequence()).as("st2 in").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(st2).hasSequentialChildren()).as("st2 children").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(st2_1).isInSequence()).as("st2_1 in").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(st2_1).hasSequentialChildren()).as("st2_1 children").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(st2_1_1).isInSequence()).as("st2_1_1 in").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(st2_1_1).hasSequentialChildren()).as("st2_1_1 children").isEqualTo(true);
+		softly.assertThat(sut.getSequenceConfig(sp2_1_1_1).isInSequence()).as("sp2_1_1_1 in").isEqualTo(true);
+		softly.assertThat(sut.getSequenceConfig(sp2_1_1_1).hasSequentialChildren()).as("sp2_1_1_1 children").isEqualTo(true);
+		softly.assertAll();
+	}
+	
+	@Test
+	public void shouldGetRooSequenceConfig() {
+		CourseNode rootWithout = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(null);
+		rootWithout.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_WITHOUT);
+		CourseNode rootSequential = CourseNodeFactory.getInstance().getCourseNodeConfiguration("st").getInstance(null);
+		rootSequential.getModuleConfiguration().setStringValue(STCourseNode.CONFIG_LP_SEQUENCE_KEY, STCourseNode.CONFIG_LP_SEQUENCE_VALUE_SEQUENTIAL);
+		
+		SoftAssertions softly = new SoftAssertions();
+		softly.assertThat(sut.getSequenceConfig(rootWithout).isInSequence()).as("root without in").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(rootWithout).hasSequentialChildren()).as("root without children").isEqualTo(false);
+		softly.assertThat(sut.getSequenceConfig(rootSequential).isInSequence()).as("root sequential in").isEqualTo(true);
+		softly.assertThat(sut.getSequenceConfig(rootSequential).hasSequentialChildren()).as("root sequential children").isEqualTo(true);
+		softly.assertAll();
+	}
+
+
+}
diff --git a/src/test/java/org/olat/course/learningpath/evaluation/LinearAccessEvaluatorTest.java b/src/test/java/org/olat/course/learningpath/evaluation/LinearAccessEvaluatorTest.java
index f42f6229462d0e346527f4017048ca5ede5f2065..5cd8d331570316eee5ace6c04c19a48eb18976e5 100644
--- a/src/test/java/org/olat/course/learningpath/evaluation/LinearAccessEvaluatorTest.java
+++ b/src/test/java/org/olat/course/learningpath/evaluation/LinearAccessEvaluatorTest.java
@@ -75,7 +75,7 @@ public class LinearAccessEvaluatorTest {
 
 	private void assertAccessible(AssessmentEntryStatus status, boolean expected) {
 		AssessmentEvaluation ae = createAssessmentEvaluation(status);
-		LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, ae);
+		LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, null, ae);
 		UserCourseEnvironment userCourseEnv = mock(UserCourseEnvironment.class);
 		when(userCourseEnv.isParticipant()).thenReturn(Boolean.TRUE);
 		
@@ -85,9 +85,9 @@ public class LinearAccessEvaluatorTest {
 	}
 	
 	@Test
-	public void shouldAlwysBeAccessibleAsCoach() {
+	public void shouldAlwaysBeAccessibleAsCoach() {
 		AssessmentEvaluation ae = createAssessmentEvaluation(AssessmentEntryStatus.notReady);
-		LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, ae);
+		LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, null, ae);
 		UserCourseEnvironment userCourseEnv = mock(UserCourseEnvironment.class);
 		when(userCourseEnv.isCoach()).thenReturn(Boolean.TRUE);
 		
@@ -97,9 +97,9 @@ public class LinearAccessEvaluatorTest {
 	}
 	
 	@Test
-	public void shouldAlwysBeAccessibleAsAdmin() {
+	public void shouldAlwaysBeAccessibleAsAdmin() {
 		AssessmentEvaluation ae = createAssessmentEvaluation(AssessmentEntryStatus.notReady);
-		LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, ae);
+		LearningPathTreeNode currentNode = new LearningPathTreeNode(createCourseNode(), 0, null, ae);
 		UserCourseEnvironment userCourseEnv = mock(UserCourseEnvironment.class);
 		when(userCourseEnv.isAdmin()).thenReturn(Boolean.TRUE);
 		
diff --git a/src/test/java/org/olat/modules/forms/manager/EvaluationFormMangerImplTest.java b/src/test/java/org/olat/modules/forms/manager/EvaluationFormMangerImplTest.java
index 5e00f9ad5bd2dce38bbc80728824b6bab7d5ee04..02dc7a6ea87d6cd0d302c27e83de97dfa122929d 100644
--- a/src/test/java/org/olat/modules/forms/manager/EvaluationFormMangerImplTest.java
+++ b/src/test/java/org/olat/modules/forms/manager/EvaluationFormMangerImplTest.java
@@ -27,6 +27,11 @@ import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.InjectMocks;
@@ -39,6 +44,8 @@ import org.olat.modules.forms.EvaluationFormSessionStatus;
 import org.olat.modules.forms.EvaluationFormSurvey;
 import org.olat.modules.forms.RubricRating;
 import org.olat.modules.forms.model.xml.Rubric;
+import org.olat.modules.forms.ui.model.CountRatioResult;
+import org.olat.modules.forms.ui.model.CountResult;
 import org.olat.repository.RepositoryEntry;
 
 /**
@@ -284,6 +291,25 @@ public class EvaluationFormMangerImplTest {
 			
 		assertThat(rating).isEqualTo(expectedRating);
 	}
+	
+	@Test
+	public void shouldCalculateRatioList() {
+		List<CountResult> countResults = new ArrayList<>();
+		countResults.add(new CountResult("1", 5));
+		countResults.add(new CountResult("2", 5));
+		countResults.add(new CountResult("3", 10));
+		countResults.add(new CountResult("4", 0));
+		
+		List<CountRatioResult> ratios = sut.calculateRatio(countResults);
+
+		Map<String, Double> percentMap = ratios.stream()
+				.collect(Collectors.toMap(CountRatioResult::getName, CountRatioResult::getRatio));
+		assertThat(percentMap.get("1")).isEqualTo(0.25);
+		assertThat(percentMap.get("2")).isEqualTo(0.25);
+		assertThat(percentMap.get("3")).isEqualTo(0.5);
+		assertThat(percentMap.get("4")).isEqualTo(0);
+	}
+
 
 
 }
diff --git a/src/test/java/org/olat/restapi/CoursesFoldersTest.java b/src/test/java/org/olat/restapi/CoursesFoldersTest.java
index f4de64c2727ec3904a20ac06a7ef12fd73e29ae0..b1704c6a6a7f7749e1c21834f44b55a0176c5b83 100644
--- a/src/test/java/org/olat/restapi/CoursesFoldersTest.java
+++ b/src/test/java/org/olat/restapi/CoursesFoldersTest.java
@@ -297,12 +297,13 @@ public class CoursesFoldersTest extends OlatRestTestCase {
 		dbInstance.intermediateCommit();
 		
 		//create a folder
+		CourseNode rootNode = course.getRunStructure().getRootNode();
 		CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration("bc");
-		CourseNode bcNode = newNodeConfig.getInstance();
+		CourseNode bcNode = newNodeConfig.getInstance(rootNode);
 		bcNode.setShortTitle("Folder");
 		bcNode.setLearningObjectives("Folder objectives");
 		bcNode.setNoAccessExplanation("You don't have access");
-		course.getEditorTreeModel().addCourseNode(bcNode, course.getRunStructure().getRootNode());
+		course.getEditorTreeModel().addCourseNode(bcNode, rootNode);
 
 		CourseFactory.publishCourse(course, RepositoryEntryStatusEnum.published, true, false, admin, Locale.ENGLISH);
 		return new CourseWithBC(course, bcNode);
diff --git a/src/test/java/org/olat/restapi/CoursesForumsTest.java b/src/test/java/org/olat/restapi/CoursesForumsTest.java
index dcbc8f038d493f1e8cf39faa417881111797c36b..2bedf9091e294348584796a6e078d49a4b0c6010 100644
--- a/src/test/java/org/olat/restapi/CoursesForumsTest.java
+++ b/src/test/java/org/olat/restapi/CoursesForumsTest.java
@@ -85,12 +85,13 @@ public class CoursesForumsTest  extends OlatRestTestCase {
 		dbInstance.intermediateCommit();
 		
 		//create a folder
+		CourseNode rootNode = course1.getRunStructure().getRootNode();
 		CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration("fo");
-		forumNode = newNodeConfig.getInstance();
+		forumNode = newNodeConfig.getInstance(rootNode);
 		forumNode.setShortTitle("Forum");
 		forumNode.setLearningObjectives("forum objectives");
 		forumNode.setNoAccessExplanation("You don't have access");
-		course1.getEditorTreeModel().addCourseNode(forumNode, course1.getRunStructure().getRootNode());
+		course1.getEditorTreeModel().addCourseNode(forumNode, rootNode);
 		
 		CourseFactory.publishCourse(course1, RepositoryEntryStatusEnum.published, true, false, admin, Locale.ENGLISH);
 		
diff --git a/src/test/java/org/olat/restapi/NotificationsTest.java b/src/test/java/org/olat/restapi/NotificationsTest.java
index 5de6e18248955b2007a9da0f5e659557583b1b1a..c8bbfb8c0135ee159c92707972c07708bfa1c949 100644
--- a/src/test/java/org/olat/restapi/NotificationsTest.java
+++ b/src/test/java/org/olat/restapi/NotificationsTest.java
@@ -50,6 +50,7 @@ import org.apache.commons.io.IOUtils;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.methods.HttpGet;
+import org.apache.logging.log4j.Logger;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -65,7 +66,6 @@ import org.olat.core.commons.services.notifications.restapi.vo.PublisherVO;
 import org.olat.core.commons.services.notifications.restapi.vo.SubscriptionInfoVO;
 import org.olat.core.commons.services.notifications.restapi.vo.SubscriptionListItemVO;
 import org.olat.core.id.Identity;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSContainer;
@@ -73,6 +73,7 @@ import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.nodes.BCCourseNode;
+import org.olat.course.nodes.CourseNode;
 import org.olat.course.nodes.CourseNodeConfiguration;
 import org.olat.course.nodes.CourseNodeFactory;
 import org.olat.course.nodes.FOCourseNode;
@@ -370,13 +371,14 @@ public class NotificationsTest extends OlatRestTestCase {
 		ICourse course = CourseFactory.loadCourse(courseEntry);
 		dbInstance.intermediateCommit();
 		//create the forum
+		CourseNode rootNode = course.getRunStructure().getRootNode();
 		CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration("fo");
-		FOCourseNode forumNode = (FOCourseNode)newNodeConfig.getInstance();
+		FOCourseNode forumNode = (FOCourseNode)newNodeConfig.getInstance(rootNode);
 		forumNode.setShortTitle("Forum");
 		forumNode.setLearningObjectives("forum objectives");
 		forumNode.setNoAccessExplanation("You don't have access");
 		Forum courseForum = forumNode.loadOrCreateForum(course.getCourseEnvironment());
-		course.getEditorTreeModel().addCourseNode(forumNode, course.getRunStructure().getRootNode());
+		course.getEditorTreeModel().addCourseNode(forumNode, rootNode);
 		CourseFactory.publishCourse(course, RepositoryEntryStatusEnum.published, true, false, id, Locale.ENGLISH);
 		dbInstance.intermediateCommit();
 		
@@ -420,14 +422,15 @@ public class NotificationsTest extends OlatRestTestCase {
 		ICourse course = CourseFactory.loadCourse(courseEntry);
 		dbInstance.intermediateCommit();
 		//create the folder
+		CourseNode rootNode = course.getRunStructure().getRootNode();
 		CourseNodeConfiguration newNodeConfig = CourseNodeFactory.getInstance().getCourseNodeConfiguration("bc");
-		BCCourseNode folderNode = (BCCourseNode)newNodeConfig.getInstance();
+		BCCourseNode folderNode = (BCCourseNode)newNodeConfig.getInstance(rootNode);
 		folderNode.setShortTitle("Folder");
 		folderNode.setLearningObjectives("folder objectives");
 		folderNode.setNoAccessExplanation("You don't have access");
 		String relPath = BCCourseNode.getFoldernodePathRelToFolderBase(course.getCourseEnvironment(), folderNode);
 		VFSContainer folder = BCCourseNode.getNodeFolderContainer(folderNode, course.getCourseEnvironment());
-		course.getEditorTreeModel().addCourseNode(folderNode, course.getRunStructure().getRootNode());
+		course.getEditorTreeModel().addCourseNode(folderNode, rootNode);
 		CourseFactory.publishCourse(course, RepositoryEntryStatusEnum.published, true, false, id, Locale.ENGLISH);
 		dbInstance.intermediateCommit();
 		
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index 919e61240ae3d877abd2339b0f0e909ad7f478ee..c0adbce870a9abe8b9e773e53679a3e1758d5cc8 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -173,6 +173,7 @@ import org.junit.runners.Suite;
 	org.olat.course.condition.ConditionTest.class,
 	org.olat.course.condition.KeyAndNameConverterTest.class,
 	org.olat.course.highscore.HighScoreManagerTest.class,
+	org.olat.course.learningpath.LearningPathServiceTest.class,
 	org.olat.course.nodes.dialog.manager.DialogElementsManagerTest.class,
 	org.olat.course.nodes.en.EnrollmentManagerSerialTest.class,
 	org.olat.course.nodes.en.EnrollmentManagerConcurrentTest.class,