diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java
index 62541c868007c81cf1612c8faff1159dd9fcc17b..dd1216f0741f08f21de224c4b63ae9182ff88a21 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableCustomRenderer.java
@@ -151,8 +151,20 @@ class FlexiTableCustomRenderer extends AbstractFlexiTableRenderer implements Com
 				}
 			}
 		}
+		
+		if(dataModel instanceof FlexiTreeTableDataModel) {
+			boolean hasChildren = ((FlexiTreeTableDataModel<?>)dataModel).hasChildren(row);
+			container.contextPut("hasChildren", hasChildren);
+			if(hasChildren) {
+				container.contextPut("isOpen", ((FlexiTreeTableDataModel<?>)dataModel).isOpen(row));
+			}
+		}
 
 		container.getHTMLRendererSingleton().render(renderer, sb, container, ubu, translator, renderResult, null);
+		container.contextRemove("openCloseLink");
+		container.contextRemove("hasChildren");
+		container.contextRemove("rowIndex");
+		container.contextRemove("isOpen");
 		container.contextRemove("row");
 		container.contextRemove("f");
 
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerTableModel.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerTableModel.java
index 17ae717cea4a6fdec092f3dfe3160a5af1620274..ee3b32c1e529152fb64c3e5e27ea5e39e0d4e2f6 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerTableModel.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerTableModel.java
@@ -154,7 +154,6 @@ public class CurriculumComposerTableModel extends DefaultFlexiTreeTableDataModel
 		return null;
 	}
 	
-
 	@Override
 	public boolean hasChildren(int row) {
 		CurriculumElementRow element = getObject(row);
@@ -184,8 +183,6 @@ public class CurriculumComposerTableModel extends DefaultFlexiTreeTableDataModel
 		}
 	}
 	
-	
-	
 	@Override
 	public CurriculumComposerTableModel createCopyWithEmptyList() {
 		return new CurriculumComposerTableModel(getTableColumnModel());
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementListController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementListController.java
index 08823a63a9e3d59001c2c69c1bb74dc11014b3a3..012b8c1530530f14d2268f9efd1b4c5dc9de1629 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementListController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementListController.java
@@ -50,6 +50,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableRendererType;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.TextFlexiCellRenderer;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.TreeNodeFlexiCellRenderer;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.stack.BreadcrumbPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
@@ -74,7 +75,6 @@ import org.olat.modules.curriculum.model.CurriculumElementRefImpl;
 import org.olat.modules.curriculum.model.CurriculumElementRepositoryEntryViews;
 import org.olat.modules.curriculum.ui.CurriculumElementWithViewsDataModel.ElementViewCols;
 import org.olat.modules.curriculum.ui.component.CurriculumElementCompositeRenderer;
-import org.olat.modules.curriculum.ui.component.CurriculumElementIndentRenderer;
 import org.olat.modules.curriculum.ui.component.CurriculumElementViewsRowComparator;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryEntryMyView;
@@ -154,9 +154,8 @@ public class CurriculumElementListController extends FormBasicController impleme
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, ElementViewCols.key));
-		DefaultFlexiColumnModel elementNameCol = new DefaultFlexiColumnModel(ElementViewCols.displayName, "select");
-		elementNameCol.setCellRenderer(new CurriculumElementCompositeRenderer("select", new CurriculumElementIndentRenderer()));
-		columnsModel.addFlexiColumnModel(elementNameCol);
+		TreeNodeFlexiCellRenderer treeNodeRenderer = new TreeNodeFlexiCellRenderer("select");
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ElementViewCols.displayName, treeNodeRenderer));
 		DefaultFlexiColumnModel elementIdentifierCol = new DefaultFlexiColumnModel(ElementViewCols.identifier, "select");
 		elementIdentifierCol.setCellRenderer(new CurriculumElementCompositeRenderer("select", new TextFlexiCellRenderer()));
 		columnsModel.addFlexiColumnModel(elementIdentifierCol);
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementWithViewsDataModel.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementWithViewsDataModel.java
index 7d56dbc37d375e0a85a1f0fde9d1025f9b1c1111..9a783b08ccdb5f064f9073062b06a75b187ba135 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementWithViewsDataModel.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementWithViewsDataModel.java
@@ -19,7 +19,11 @@
  */
 package org.olat.modules.curriculum.ui;
 
-import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTreeTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 
@@ -29,12 +33,23 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-public class CurriculumElementWithViewsDataModel extends DefaultFlexiTableDataModel<CurriculumElementWithViewsRow> {
+public class CurriculumElementWithViewsDataModel extends DefaultFlexiTreeTableDataModel<CurriculumElementWithViewsRow> {
 	
 	public CurriculumElementWithViewsDataModel(FlexiTableColumnModel columnsModel) {
 		super(columnsModel);
 	}
 	
+	@Override
+	public void filter(String searchString, List<FlexiTableFilter> filters) {
+		setObjects(new ArrayList<>(backupRows));
+	}
+	
+	@Override
+	public boolean hasChildren(int row) {
+		CurriculumElementWithViewsRow element = getObject(row);
+		return element.hasChildren();
+	}
+
 	@Override
 	public Object getValueAt(int row, int col) {
 		CurriculumElementWithViewsRow curriculum = getObject(row);
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementWithViewsRow.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementWithViewsRow.java
index 07fe44e92431849af451a5ae315a0ed9712c48a5..edc986fa103cb5b960a07c6ae5bec2850bcd1931 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementWithViewsRow.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementWithViewsRow.java
@@ -84,7 +84,7 @@ public class CurriculumElementWithViewsRow implements CurriculumElementWithView,
 	
 	public CurriculumElementWithViewsRow(CurriculumElement element, CurriculumElementMembership curriculumMembership, int myEntryCount) {
 		this.element = element;
-		elementType = element == null ? null : element.getType();
+		elementType = element.getType();
 		this.curriculumMembership = curriculumMembership;
 		curriculumMember = curriculumMembership != null && curriculumMembership.hasMembership();
 		singleEntry = false;
diff --git a/src/main/java/org/olat/modules/curriculum/ui/_content/curriculum_element_row.html b/src/main/java/org/olat/modules/curriculum/ui/_content/curriculum_element_row.html
index d9275bab124ecab97fe36ee3c8e3f2ec90c799cc..49a59b436d703858b6bd9b2e619e9deca246ae99 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/_content/curriculum_element_row.html
+++ b/src/main/java/org/olat/modules/curriculum/ui/_content/curriculum_element_row.html
@@ -3,6 +3,14 @@
 #if(${row.isCurriculumElementOnly()} || ${row.isCurriculumElementWithEntry()})
 	#set ($headerTag = "h" + ($row.level + 2))
 	<$headerTag class="o_curriculum_element_title">
+		#if($r.isTrue($hasChildren))
+			#if($r.isTrue($isOpen))
+				<a href="javascript:;" onclick="$f.ffXHREvent("tt-close",${rowIndex})">
+			#else
+				<a href="javascript:;" onclick="$f.ffXHREvent("tt-open",${rowIndex})">
+			#end
+			<i class='o_icon o_icon-fw #if($r.isTrue($isOpen)) o_icon_close_tree #else o_icon_open_tree #end'> </i></a>
+		#end
 		$r.escapeHtml($row.curriculumElementDisplayName) 
 		<small>$r.escapeHtml($row.curriculumElementIdentifier) </small>
 		#if($row.getCurriculumElementTypeName())<small class="o_type">($row.getCurriculumElementTypeName())</small>#end