diff --git a/src/main/java/org/olat/admin/user/bulkChange/GroupAddOverviewModel.java b/src/main/java/org/olat/admin/user/bulkChange/GroupAddOverviewModel.java
index 8779dfdd71c5f2b75b4bd84b045d2bee36e417a4..4369d6afe7de0acc422b801b6093c128cbef4712 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/GroupAddOverviewModel.java
+++ b/src/main/java/org/olat/admin/user/bulkChange/GroupAddOverviewModel.java
@@ -22,7 +22,8 @@ package org.olat.admin.user.bulkChange;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.olat.core.gui.components.table.DefaultTableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.filter.FilterFactory;
 import org.olat.group.BusinessGroup;
@@ -36,26 +37,23 @@ import org.olat.group.BusinessGroup;
  * Initial Date:  09.05.2011 <br>
  * @author Roman Haag, frentix GmbH, roman.haag@frentix.com
  */
-public class GroupAddOverviewModel extends DefaultTableDataModel<BusinessGroup> {
+public class GroupAddOverviewModel extends DefaultFlexiTableDataModel<BusinessGroup> {
 
 	private Translator translator;
 	private List<Long> mailGroupIDs;
 	private List<Long> ownGroupIDs;
 	private List<Long> partGroupIDs;
 
-	public GroupAddOverviewModel(List<BusinessGroup> allGroupIDs, List<Long> ownGroupIDs, List<Long> partGroupIDs, List<Long> mailGroups, Translator trans) {
-		super(allGroupIDs);
+	public GroupAddOverviewModel(List<BusinessGroup> allGroupIDs, List<Long> ownGroupIDs, List<Long> partGroupIDs, List<Long> mailGroups,
+			Translator trans, FlexiTableColumnModel columnModel) {
+		super(columnModel);
+		setObjects(allGroupIDs);
 		this.translator = trans;
 		this.ownGroupIDs = ownGroupIDs;
 		this.partGroupIDs = partGroupIDs;
 		this.mailGroupIDs = mailGroups;
 	}
 
-	@Override
-	public int getColumnCount() {
-		return 5;
-	}
-
 	@Override
 	public Object getValueAt(int row, int col) {
 		BusinessGroup group = getObject(row);		
@@ -93,6 +91,6 @@ public class GroupAddOverviewModel extends DefaultTableDataModel<BusinessGroup>
 
 	@Override
 	public GroupAddOverviewModel createCopyWithEmptyList() {
-		return new GroupAddOverviewModel(new ArrayList<BusinessGroup>(), ownGroupIDs, partGroupIDs, mailGroupIDs, translator);
+		return new GroupAddOverviewModel(new ArrayList<>(), ownGroupIDs, partGroupIDs, mailGroupIDs, translator, getTableColumnModel());
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/user/bulkChange/OverviewModel.java b/src/main/java/org/olat/admin/user/bulkChange/OverviewModel.java
index 51fcd0bbab89915d38993292738c4ca9b8255dc9..d327935f314854f851008c2b824f3714636c7cd8 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/OverviewModel.java
+++ b/src/main/java/org/olat/admin/user/bulkChange/OverviewModel.java
@@ -22,7 +22,8 @@ package org.olat.admin.user.bulkChange;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.olat.core.gui.components.table.DefaultTableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 
 /**
  * Description:<br>
@@ -33,18 +34,11 @@ import org.olat.core.gui.components.table.DefaultTableDataModel;
  * 
  * @author rhaag
  */
-public class OverviewModel extends DefaultTableDataModel<List<String>> {
+public class OverviewModel extends DefaultFlexiTableDataModel<List<String>> {
 
-	private int columnCount = 0;
-
-	public OverviewModel(List<List<String>> objects, int columnCount) {
-		super(objects);
-		this.columnCount = columnCount;
-	}
-
-	@Override
-	public int getColumnCount() {
-		return columnCount;
+	public OverviewModel(List<List<String>> objects, FlexiTableColumnModel columnModel) {
+		super(columnModel);
+		setObjects(objects);
 	}
 
 	@Override
@@ -55,7 +49,7 @@ public class OverviewModel extends DefaultTableDataModel<List<String>> {
 	}
 
 	@Override
-	public Object createCopyWithEmptyList() {
-		return new OverviewModel(new ArrayList<List<String>>(), columnCount);
+	public OverviewModel createCopyWithEmptyList() {
+		return new OverviewModel(new ArrayList<List<String>>(), getTableColumnModel());
 	}
 }
diff --git a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep02.java b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep02.java
index 4afa4d606ac4b9640ae9b786e5130ba18016ef50..c41ce7ad69b1740b59864e820ddee78270ad547e 100644
--- a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep02.java
+++ b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeStep02.java
@@ -39,11 +39,8 @@ import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 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.FlexiTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelImpl;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.TextFlexiCellRenderer;
-import org.olat.core.gui.components.table.TableDataModel;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.wizard.BasicStep;
@@ -172,7 +169,7 @@ class UserBulkChangeStep02 extends BasicStep {
 			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.removed", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
 			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, "table.role.status", colPos++, false, null, FlexiColumnModel.ALIGNMENT_LEFT, textRenderer));
 
-			FlexiTableDataModel<List<String>> tableDataModel = new FlexiTableDataModelImpl<>(new OverviewModel(mergedDataChanges, colPos), tableColumnModel);
+			OverviewModel tableDataModel = new OverviewModel(mergedDataChanges, tableColumnModel);
 			uifactory.addTableElement(getWindowControl(), "newUsers", tableDataModel, getTranslator(), formLayoutVertical);
 
 			Set<Long> allGroups = new HashSet<>(); 
@@ -192,9 +189,7 @@ class UserBulkChangeStep02 extends BasicStep {
 				groupColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("send.email", 3));
 
 				List<BusinessGroup> groups = businessGroupService.loadBusinessGroups(allGroups);
-				TableDataModel<BusinessGroup> model = new GroupAddOverviewModel(groups, ownGroups, partGroups, mailGroups, getTranslator()); 
-				FlexiTableDataModel<BusinessGroup> groupDataModel = new FlexiTableDataModelImpl<>(model, groupColumnModel);
-				
+				GroupAddOverviewModel groupDataModel = new GroupAddOverviewModel(groups, ownGroups, partGroups, mailGroups, getTranslator(), groupColumnModel); 
 				uifactory.addTableElement(getWindowControl(), "groupOverview", groupDataModel, getTranslator(), formLayout);
 			}
 		}
diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep00.java b/src/main/java/org/olat/admin/user/imp/ImportStep00.java
index 70075de371ffae86ec89595a38ed89237641f237..b277bd0997ca7aee53d83637b03eed5cb47de7e9 100644
--- a/src/main/java/org/olat/admin/user/imp/ImportStep00.java
+++ b/src/main/java/org/olat/admin/user/imp/ImportStep00.java
@@ -99,11 +99,9 @@ class ImportStep00 extends BasicStep {
 
 	@Override
 	public StepFormController getStepController(UserRequest ureq, WindowControl windowControl, StepsRunContext stepsRunContext, Form form) {
-		StepFormController stepI = new ImportStepForm00(ureq, windowControl, form, stepsRunContext);
-		return stepI;
+		return new ImportStepForm00(ureq, windowControl, form, stepsRunContext);
 	}
 
-
 	private final class ImportStepForm00 extends StepFormBasicController {
 
 		private List<Identity> idents;
diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep01.java b/src/main/java/org/olat/admin/user/imp/ImportStep01.java
index 88d7cf14489fe2c62161541748be7ab2cab17d80..537007b03c20fb3ec197c2e237d0d832b0902f61 100644
--- a/src/main/java/org/olat/admin/user/imp/ImportStep01.java
+++ b/src/main/java/org/olat/admin/user/imp/ImportStep01.java
@@ -35,9 +35,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.AbstractCS
 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.FlexiTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelImpl;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.wizard.BasicStep;
@@ -74,16 +72,13 @@ class ImportStep01 extends BasicStep {
 
 	@Override
 	public StepFormController getStepController(UserRequest ureq, WindowControl windowControl, StepsRunContext stepsRunContext, Form form) {
-		StepFormController stepI = new ImportStepForm01(ureq, windowControl, form, stepsRunContext);
-		return stepI;
+		return new ImportStepForm01(ureq, windowControl, form, stepsRunContext);
 	}
 
 	private final class ImportStepForm01 extends StepFormBasicController {
 		
-		
-		private FormLayoutContainer textContainer;
-		private SingleSelection updateEl, updatePasswordEl;
-		private List<UserPropertyHandler> userPropertyHandlers;
+		private SingleSelection updateEl;
+		private SingleSelection updatePasswordEl;
 
 		@Autowired
 		private UserManager userManager;
@@ -119,7 +114,7 @@ class ImportStep01 extends BasicStep {
 
 		@Override
 		protected boolean validateFormLogic(UserRequest ureq) {
-			boolean allOk = true;
+			boolean allOk = super.validateFormLogic(ureq);
 			if(updateEl != null && (!updateEl.isOneSelected() || updateEl.isSelected(0))) {
 				updateEl.setErrorKey("form.mandatory.hover", null);
 				allOk &= false;
@@ -129,7 +124,7 @@ class ImportStep01 extends BasicStep {
 				updatePasswordEl.setErrorKey("form.mandatory.hover", null);
 				allOk &= false;
 			}
-			return allOk & super.validateFormLogic(ureq);
+			return allOk;
 		}
 
 		@Override
@@ -145,7 +140,7 @@ class ImportStep01 extends BasicStep {
 			List<UpdateIdentity> updateIdents = (List<UpdateIdentity>) getFromRunContext("updateIdents");
 			@SuppressWarnings("unchecked")
 			List<TransientIdentity> newIdents = (List<TransientIdentity>) getFromRunContext("newIdents");
-			textContainer = FormLayoutContainer.createCustomFormLayout("step1", getTranslator(), velocity_root + "/step1.html");
+			FormLayoutContainer textContainer = FormLayoutContainer.createCustomFormLayout("step1", getTranslator(), velocity_root + "/step1.html");
 			formLayoutVertical.add(textContainer);
 
 			int cntall = idents.size();
@@ -183,14 +178,13 @@ class ImportStep01 extends BasicStep {
 			tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.user.lang", colPos++));
 
 			// followed by all properties configured
-			// if only mandatory required: check for um.isMandatoryUserProperty(usageIdentifyer, userPropertyHandler);
-			userPropertyHandlers = UserManager.getInstance().getUserPropertyHandlersFor(usageIdentifyer, true);
+			List<UserPropertyHandler> userPropertyHandlers = userManager.getUserPropertyHandlersFor(usageIdentifyer, true);
 			for (int i = 0; i < userPropertyHandlers.size(); i++) {
 				UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(i);
-					tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos++));
+				tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel(userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos++));
 			}
 
-			FlexiTableDataModel<Identity> tableDataModel = new FlexiTableDataModelImpl<>(new Model(idents, colPos), tableColumnModel);
+			Model tableDataModel = new Model(idents, tableColumnModel, getLocale());
 			uifactory.addTableElement(getWindowControl(), "newUsers", tableDataModel, getTranslator(), formLayoutVertical);
 		}
 	}
diff --git a/src/main/java/org/olat/admin/user/imp/Model.java b/src/main/java/org/olat/admin/user/imp/Model.java
index f2ccdb5904f1b4ccd8ff24a2cb45d4417d03af51..8c64cc61a35d429e631aeb1d77d2d11175b88f6d 100644
--- a/src/main/java/org/olat/admin/user/imp/Model.java
+++ b/src/main/java/org/olat/admin/user/imp/Model.java
@@ -25,9 +25,12 @@
 
 package org.olat.admin.user.imp;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
 
-import org.olat.core.gui.components.table.DefaultTableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 import org.olat.core.id.Identity;
 import org.olat.user.UserManager;
 import org.olat.user.propertyhandlers.UserPropertyHandler;
@@ -39,21 +42,17 @@ import org.olat.user.propertyhandlers.UserPropertyHandler;
  * 
  * Description: Table model for user mass import.
  */
-public class Model extends DefaultTableDataModel<Identity> {
+public class Model extends DefaultFlexiTableDataModel<Identity> {
 
-	private List<UserPropertyHandler> userPropertyHandlers;
+	private final Locale locale;
+	private final List<UserPropertyHandler> userPropertyHandlers;
 	private static final String usageIdentifyer = UserImportController.class.getCanonicalName();
-	private int columnCount = 0;
 
-	public Model(List<Identity> objects, int columnCount) {
-		super(objects);
+	public Model(List<Identity> objects, FlexiTableColumnModel columnModel, Locale locale) {
+		super(columnModel);
+		this.locale = locale;
 		userPropertyHandlers = UserManager.getInstance().getUserPropertyHandlersFor(usageIdentifyer, true);
-		this.columnCount = columnCount;
-	}
-
-	@Override
-	public int getColumnCount() {
-		return columnCount;
+		setObjects(objects);
 	}
 
 	@Override
@@ -83,9 +82,14 @@ public class Model extends DefaultTableDataModel<Identity> {
 		} else if (col > 3 && col < getColumnCount()) {
 			// get user property for this column for an already existing user
 			UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(col - 4);
-			String value = userPropertyHandler.getUserProperty(ident.getUser(), getLocale());
+			String value = userPropertyHandler.getUserProperty(ident.getUser(), locale);
 			return (value == null ? "n/a" : value);
 		}
 		return "ERROR";
 	}
+
+	@Override
+	public DefaultFlexiTableDataModel<Identity> createCopyWithEmptyList() {
+		return new Model(new ArrayList<>(), getTableColumnModel(), locale);
+	}
 }
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableDataModelImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableDataModelImpl.java
deleted file mode 100644
index 0df1929d1e9bb02b0dc291a835071858fb164c58..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableDataModelImpl.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
-* OLAT - Online Learning and Training<br>
-* http://www.olat.org
-* <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
-* <p>
-* http://www.apache.org/licenses/LICENSE-2.0
-* <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>
-* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
-* University of Zurich, Switzerland.
-* <hr>
-* <a href="http://www.openolat.org">
-* OpenOLAT - Online Learning and Training</a><br>
-* This file has been modified by the OpenOLAT community. Changes are licensed
-* under the Apache 2.0 license as the original file.  
-* <p>
-*/ 
-
-package org.olat.core.gui.components.form.flexible.impl.elements.table;
-
-import org.olat.core.gui.components.table.TableDataModel;
-
-/**
- * Table data model including column models.
- * @author Christian Guretzki
- */
-public class FlexiTableDataModelImpl<T> implements FlexiTableDataModel<T> {
-	
-	private TableDataModel<T> tableModel;
-	private FlexiTableColumnModel tableColumnModel;
-
-	/**
-	 * Constructor to create a FlexiTableDataModel with a non-flexi table data model as input.
-	 * @param tableModel        non-flexi table data model
-	 * @param tableColumnModel  table-column-model (all columns)
-	 */
-	public FlexiTableDataModelImpl(TableDataModel<T> tableModel, FlexiTableColumnModel tableColumnModel ) {
-		this.tableModel = tableModel;
-		this.tableColumnModel = tableColumnModel;
-	}
-	
-	@Override
-	public boolean isSelectable(int row) {
-		return true;
-	}
-
-	/**
-	 * @return Number of table row.
-	 */
-	@Override
-	public int getRowCount() {
-		return tableModel.getRowCount();
-	}
-	
-	@Override
-	public boolean isRowLoaded(int row) {
-		return row < tableModel.getRowCount();
-	}
-
-	@Override
-	public T getObject(int row) {
-		return tableModel.getObject(row);
-	}
-
-	/**
-	 * Return Object for certain table cell.
-	 * @param row Row number [0...row]
-	 * @param col column number [0...column]
-	 * @return Object for certain table cell
-	 */
-	@Override
-	public Object getValueAt(int row, int col) {
-		return tableModel.getValueAt(row, col);
-	}
-
-	/**
-	 * Return table-column-model (all columns) for this table-data-model.
-	 * @return table-column-model
-	 */
-	@Override
-	public FlexiTableColumnModel getTableColumnModel() {
-		return tableColumnModel;
-	}
-
-	/**
-	 * Set table-column-model (all columns) for this table-data-model.
-	 */
-	@Override
-	public void setTableColumnModel(FlexiTableColumnModel tableColumnModel) {
-		this.tableColumnModel = tableColumnModel;
-	}
-
-}
\ No newline at end of file
diff --git a/src/main/java/org/olat/course/highscore/ui/HighScoreFlexiTableModel.java b/src/main/java/org/olat/course/highscore/ui/HighScoreFlexiTableModel.java
index ae456c25805bbfd92e0fa3b4bdb51f3b439802f7..6b7738487a2bb4522170d6a1643f5d131b742877 100644
--- a/src/main/java/org/olat/course/highscore/ui/HighScoreFlexiTableModel.java
+++ b/src/main/java/org/olat/course/highscore/ui/HighScoreFlexiTableModel.java
@@ -21,41 +21,31 @@ package org.olat.course.highscore.ui;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.olat.core.gui.components.table.TableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 import org.olat.core.id.Identity;
 /**
  * Initial Date:  5.08.2016 <br>
  * @author fkiefer
  */
-public class HighScoreFlexiTableModel implements TableDataModel<HighScoreTableEntry> {
+public class HighScoreFlexiTableModel extends DefaultFlexiTableDataModel<HighScoreTableEntry> {
 	
-	private final int COLUMN_COUNT = 3;
 	private final String placeholder;
-	private List<HighScoreTableEntry> entries;
 	private final boolean anonymous;
 	private Identity ownId;
 
 	public HighScoreFlexiTableModel(List<HighScoreTableEntry> entries, boolean anonymous, String placeholder,
-			Identity ownId) {
-		this.entries = entries;
+			Identity ownId, FlexiTableColumnModel columnModel) {
+		super(columnModel);
+		this.setObjects(entries);
 		this.anonymous = anonymous;
 		this.placeholder = placeholder;
 		this.ownId = ownId;
 	}
 
-	@Override
-	public int getColumnCount() {
-		return COLUMN_COUNT;
-	}
-
-	@Override
-	public int getRowCount() {
-		return entries == null ? 0 : entries.size();
-	}
-
 	@Override
 	public Object getValueAt(int row, int col) {
-		HighScoreTableEntry entry = entries.get(row);
+		HighScoreTableEntry entry = getObject(row);
 		switch(col) {
 			case 0: return entry.getRank();
 			case 1: return entry.getScore();
@@ -65,19 +55,7 @@ public class HighScoreFlexiTableModel implements TableDataModel<HighScoreTableEn
 	}
 
 	@Override
-	public HighScoreTableEntry getObject(int row) {
-		return null;
-	}
-
-	@Override
-	public void setObjects(List<HighScoreTableEntry> entries) {
-		this.entries = entries;
+	public HighScoreFlexiTableModel createCopyWithEmptyList() {
+		return new HighScoreFlexiTableModel(new ArrayList<>(), anonymous, placeholder, ownId, getTableColumnModel());
 	}
-
-	@Override
-	public Object createCopyWithEmptyList() {
-		return new HighScoreFlexiTableModel(new ArrayList<>(), anonymous,placeholder,ownId);
-	}
-	
-
 }
diff --git a/src/main/java/org/olat/course/highscore/ui/HighScoreRunController.java b/src/main/java/org/olat/course/highscore/ui/HighScoreRunController.java
index 2ad23cc5e71579598315bdd7421908a711877b4d..ca5c2644309c4602bd607ad1ec94cbb4b36c2c8d 100644
--- a/src/main/java/org/olat/course/highscore/ui/HighScoreRunController.java
+++ b/src/main/java/org/olat/course/highscore/ui/HighScoreRunController.java
@@ -38,9 +38,7 @@ 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.DefaultFlexiTableCssDelegate;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelImpl;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableRendererType;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
@@ -71,7 +69,8 @@ public class HighScoreRunController extends FormBasicController{
 	
 	private static final String GUIPREF_KEY_HIGHSCORE = "highscore";
 	
-	private FlexiTableDataModel<HighScoreTableEntry> tableDataModel, tableDataModel2;
+	private HighScoreFlexiTableModel tableDataModel;
+	private HighScoreFlexiTableModel tableDataModel2;
 	private List<HighScoreTableEntry> allMembers, ownIdMembers;
 	private List<List<HighScoreTableEntry>> allPodium;
 	private List<Integer> ownIdIndices;
@@ -326,8 +325,8 @@ public class HighScoreRunController extends FormBasicController{
 				allMembers.subList(tableSize, allMembers.size()).clear();
 			}
 
-			tableDataModel = new FlexiTableDataModelImpl<>(new HighScoreFlexiTableModel(allMembers, anonymous, 
-					translate("highscore.anonymous"),ownIdentity), tableColumnModel);
+			tableDataModel = new HighScoreFlexiTableModel(allMembers, anonymous, 
+					translate("highscore.anonymous"),ownIdentity, tableColumnModel);
 			FlexiTableElement topTenTable = uifactory.addTableElement(getWindowControl(), "table", tableDataModel, 
 					getTranslator(), formLayout);
 			topTenTable.setNumOfRowsEnabled(false);
@@ -336,10 +335,8 @@ public class HighScoreRunController extends FormBasicController{
 
 			//establish a 2nd table if ownID position is greater than first table's size setting
 			if (!ownIdMembers.isEmpty()) {
-				tableDataModel2 = new FlexiTableDataModelImpl<>(
-						new HighScoreFlexiTableModel(ownIdMembers, anonymous, 
-								translate("highscore.anonymous"), ownIdentity),
-						tableColumnModel);
+				tableDataModel2 = new HighScoreFlexiTableModel(ownIdMembers, anonymous, 
+								translate("highscore.anonymous"), ownIdentity, tableColumnModel);
 				FlexiTableElement tableElement = uifactory.addTableElement(
 						getWindowControl(), "table2", tableDataModel2, getTranslator(), formLayout);
 				tableElement.setNumOfRowsEnabled(false);
@@ -347,7 +344,7 @@ public class HighScoreRunController extends FormBasicController{
 				tableElement.setCssDelegate(new MarkedMemberCssDelegate(true));
 			}
 		}			
-		if (viewPosition && ownIdIndices.size() > 0) {
+		if (viewPosition && !ownIdIndices.isEmpty()) {
 			int amountWorse = allScores.length - ownIdIndices.get(0) - 1;
 			if (amountWorse > 0) {
 				mainVC.contextPut("relposition", translate("highscore.position.inrelation",
diff --git a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiForm.java b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiForm.java
index dd978a0a77145455ef7874f791c558d1132fcf4d..d8df87492694d6db87b2834a68fb1611c181e95d 100644
--- a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiForm.java
+++ b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiForm.java
@@ -76,9 +76,6 @@ public class GuiDemoFlexiForm extends FormBasicController {
 		// but typically initForm(..) is the last call in the constructor.
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#doDispose(boolean)
-	 */
 	@Override
 	protected void doDispose() {
 		// cleanup tempt files
@@ -86,10 +83,7 @@ public class GuiDemoFlexiForm extends FormBasicController {
 			tmpFile.delete();
 		}
 	}
-	
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formOK(org.olat.core.gui.UserRequest)
-	 */
+
 	@Override
 	protected void formOK(UserRequest ureq) {
 		// this method is called if the form has validated
@@ -118,10 +112,6 @@ public class GuiDemoFlexiForm extends FormBasicController {
 		initialPanel.pushContent(confirm);
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#initForm(org.olat.core.gui.components.form.flexible.FormItemContainer,
-	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.UserRequest)
-	 */
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		/*
@@ -147,8 +137,7 @@ public class GuiDemoFlexiForm extends FormBasicController {
 		lastName.setPlaceholderText("Muster");
 		lastName.setHelpUrl("https://en.wikipedia.org/wiki/Family_name");
 
-		fileElement = uifactory.addFileElement(getWindowControl(), "file", formLayout);
-		fileElement.setLabel("guidemo.flexi.form.file", null);
+		fileElement = uifactory.addFileElement(getWindowControl(), "file", "guidemo.flexi.form.file", formLayout);
 		fileElement.setMaxUploadSizeKB(500, "guidemo.flexi.form.filetobig", null);
 		Set<String> mimeTypes = new HashSet<>();
 		mimeTypes.add("image/*");
diff --git a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiTablesController.java b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiTablesController.java
index ff81e7d57629b0851215c40252c28753c6870bdd..ff07c00d5fd2e0f248bf5b4128ba82999f57bc96 100644
--- a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiTablesController.java
+++ b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiTablesController.java
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.UUID;
 
 import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
 import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
@@ -40,14 +41,12 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.elements.FormLinkImpl;
 import org.olat.core.gui.components.form.flexible.impl.elements.MultipleSelectionElementImpl;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer;
 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.FlexiTableDataModel;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
-import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelImpl;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent;
-import org.olat.core.gui.components.table.BaseTableDataModelWithoutFilter;
+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.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -63,7 +62,7 @@ import org.olat.core.gui.translator.Translator;
  */
 public class GuiDemoFlexiTablesController extends FormBasicController {
 	
-	private FlexiTableDataModel<Row> tableDataModel;
+	private SampleFlexiTableModel tableDataModel;
 	
 	public GuiDemoFlexiTablesController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl, "flexitable");
@@ -86,25 +85,26 @@ public class GuiDemoFlexiTablesController extends FormBasicController {
     // column 7 : Link
 		tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("guidemo.table.header7", 6));
 
-		tableDataModel = new FlexiTableDataModelImpl<>(new SampleFlexiTableModel(formLayout), tableColumnModel);
-		uifactory.addTableElement(getWindowControl(), "gui-demo", tableDataModel, getTranslator(), formLayout);
+		tableDataModel = new SampleFlexiTableModel(tableColumnModel);
+		int iEntries = 50;
+		List<Row> entries = new ArrayList<>(iEntries);
+		for (int i=0; i < iEntries; i++) {
+			entries.add(new Row(i, formLayout));
+		}
+		tableDataModel.setObjects(entries);
+		
+		uifactory.addTableElement(getWindowControl(), "gui-demo", tableDataModel, 24, true, getTranslator(), formLayout);
 		uifactory.addFormSubmitButton("ok", formLayout);
 	}
 	
+	@Override
 	protected void doDispose() {
 		//
 	}
-
-	@Override
-	protected boolean validateFormLogic(UserRequest ureq) {
-		boolean isInputValid = true;
-		//do some validation here
-		return isInputValid && super.validateFormLogic(ureq);			
-	}
 	
 	@Override
-	protected void formInnerEvent(UserRequest ureq, org.olat.core.gui.components.form.flexible.FormItem source, FormEvent event) {
-		System.out.println("TEST formInnerEvent");
+	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
+		logInfo("TEST formInnerEvent");
 	}
 	
 	@Override
@@ -112,7 +112,7 @@ public class GuiDemoFlexiTablesController extends FormBasicController {
 		Object obj = tableDataModel.getValueAt(0, 2);
 		if(obj instanceof MultipleSelectionElement) {
 			MultipleSelectionElement selection = (MultipleSelectionElement)obj;
-			System.out.println(selection.getSelectedKeys());
+			logInfo(selection.getSelectedKeys().toString());
 			
 		}
 		fireEvent(ureq, Event.DONE_EVENT);  
@@ -127,28 +127,15 @@ public class GuiDemoFlexiTablesController extends FormBasicController {
 	 * Example legacy (non-flexi-table) table-model.
 	 * @author guretzki
 	 */
-	private class SampleFlexiTableModel extends BaseTableDataModelWithoutFilter<Row> {
-		private final int COLUMN_COUNT = 7;
-		private final List<Row> entries;
-
-		public SampleFlexiTableModel(FormItemContainer formContainer) {
-			int iEntries = 50;
-			entries = new ArrayList<>(iEntries);
-			for (int i=0; i < iEntries; i++) {
-				entries.add(new Row(i, formContainer));
-			}
-		}
-
-		public int getColumnCount() {
-			return COLUMN_COUNT;
-		}
+	private class SampleFlexiTableModel extends DefaultFlexiTableDataModel<Row> {
 
-		public int getRowCount() {
-			return entries.size();
+		public SampleFlexiTableModel(FlexiTableColumnModel tableColumnModel) {
+			super(tableColumnModel);
 		}
 
+		@Override
 		public Object getValueAt(int row, int col) {
-			Row entry = entries.get(row);
+			Row entry = getObject(row);
 			switch(col) {
 				case 0: return entry.getCol1();
 				case 1: return entry.getCol2();
@@ -160,6 +147,11 @@ public class GuiDemoFlexiTablesController extends FormBasicController {
 				default: return entry;
 			}
 		}
+
+		@Override
+		public DefaultFlexiTableDataModel<Row> createCopyWithEmptyList() {
+			return new SampleFlexiTableModel(getTableColumnModel());
+		}
 	}
 	
 	private class Row {