diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java
index 21de182e35dac9b3611f5147eb24b067ba88c425..5c434a6300be759ca3fb52e14eb4b6c9653ea462 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/richText/RichTextConfiguration.java
@@ -155,6 +155,7 @@ public class RichTextConfiguration implements Disposable {
 	private boolean allowCustomMediaFactory = true;
 	private boolean inline = false;
 	private boolean sendOnBlur;
+	private boolean readOnly;
 	private CustomLinkTreeModel linkBrowserCustomTreeModel;	
 	// DOM ID of the flexi form element
 	private String domID;
@@ -454,6 +455,15 @@ public class RichTextConfiguration implements Disposable {
 	public void setPathInStatusBar(boolean pathInStatusBar) {
 		this.pathInStatusBar = pathInStatusBar;
 	}
+	
+
+	public boolean isReadOnly() {
+		return readOnly;
+	}
+
+	public void setReadOnly(boolean readOnly) {
+		this.readOnly = readOnly;
+	}
 
 	public RichTextConfigurationDelegate getAdditionalConfiguration() {
 		return additionalConfiguration;
@@ -988,6 +998,9 @@ public class RichTextConfiguration implements Disposable {
 		  .append("statusbar:").append(true).append(",\n")
 		  .append("resize:").append(true).append(",\n")
 		  .append("menubar:").append(tinyConfig.hasMenu()).append(",\n");
+ 		if(isReadOnly()) {
+ 			tinyMenuSb.append("readonly: 1,\n");
+ 		}
  		
  		String leftAndClear = "Left and clear";
  		String rightAndClear = "Right and clear";
diff --git a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java
index 43ac1cca8d5343a2e236191f7f270caaade266d9..baaec9eb8a8775536b4a6cbdf3336116f0b721f2 100644
--- a/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java
+++ b/src/main/java/org/olat/core/gui/control/generic/iframe/IFrameDeliveryMapper.java
@@ -76,7 +76,7 @@ public class IFrameDeliveryMapper implements Mapper {
 
 	private String frameId;
 	private String customCssURL;
-	private CustomCSSDelegate customCssDelegate;
+	private transient CustomCSSDelegate customCssDelegate;
 	private String themeBaseUri;
 	private String customHeaderContent;
 	
@@ -174,6 +174,9 @@ public class IFrameDeliveryMapper implements Mapper {
 	
 	public void setCustomCssDelegate(CustomCSSDelegate customCssDelegate) {
 		this.customCssDelegate = customCssDelegate;
+		if(customCssDelegate.getCustomCSS() != null) {
+			customCssURL = customCssDelegate.getCustomCSS().getCSSURLIFrame();
+		}
 	}
 
 	@Override
@@ -328,14 +331,14 @@ public class IFrameDeliveryMapper implements Mapper {
 				//add olat content css as used in html editor
 				sb.appendOpenolatCss();//css only loaded once in HtmlOutput
 			}
-			if (customCssURL != null) {
-				// add the custom  CSS, e.g. the course css that overrides the standard content css
-				sb.appendCss(customCssURL, "customcss");				
-			} else if(customCssDelegate != null && customCssDelegate.getCustomCSS() != null
+			if(customCssDelegate != null && customCssDelegate.getCustomCSS() != null
 					&& customCssDelegate.getCustomCSS().getCSSURLIFrame() != null) {
 				String  customCssURL = customCssDelegate.getCustomCSS().getCSSURLIFrame();
 				sb.appendCss(customCssURL, "customcss");	
-			}
+			} else if (customCssURL != null) {
+				// add the custom  CSS, e.g. the course css that overrides the standard content css
+				sb.appendCss(customCssURL, "customcss");				
+			} 
 		}
 		
 		if (enableTextmarking) {
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBEditorController.java
index cf9ae4dba43c11a25cd427f510c8c3e845bb7999..ad059503a1f95b7d25347260efe366cb6061a944 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBEditorController.java
@@ -93,8 +93,8 @@ public class FIBEditorController extends FormBasicController {
 		textEl = uifactory.addRichTextElementForQTI21("desc", "form.imd.descr", question, 16, -1, itemContainer,
 				formLayout, ureq.getUserSession(),  getWindowControl());
 		textEl.addActionListener(FormEvent.ONCLICK);
-		textEl.setEnabled(!restrictedEdit);
 		RichTextConfiguration richTextConfig = textEl.getEditorConfiguration();
+		richTextConfig.setReadOnly(restrictedEdit);
 		
 		boolean hasNumericals = itemBuilder.hasNumericalInputs();
 		boolean hasTexts = itemBuilder.hasTextEntry();
@@ -221,14 +221,14 @@ public class FIBEditorController extends FormBasicController {
 		}
 		
 		if(interaction instanceof TextEntry) {
-			textEntrySettingsCtrl = new FIBTextEntrySettingsController(ureq, getWindowControl(), (TextEntry)interaction);
+			textEntrySettingsCtrl = new FIBTextEntrySettingsController(ureq, getWindowControl(), (TextEntry)interaction, restrictedEdit);
 			listenTo(textEntrySettingsCtrl);
 			
 			cmc = new CloseableModalController(getWindowControl(), translate("close"), textEntrySettingsCtrl.getInitialComponent(), true, translate("title.add") );
 			cmc.activate();
 			listenTo(cmc);
 		} else if(interaction instanceof NumericalEntry) {
-			numericalEntrySettingsCtrl = new FIBNumericalEntrySettingsController(ureq, getWindowControl(), (NumericalEntry)interaction);
+			numericalEntrySettingsCtrl = new FIBNumericalEntrySettingsController(ureq, getWindowControl(), (NumericalEntry)interaction, restrictedEdit);
 			listenTo(numericalEntrySettingsCtrl);
 			
 			cmc = new CloseableModalController(getWindowControl(), translate("close"), numericalEntrySettingsCtrl.getInitialComponent(), true, translate("title.add") );
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBNumericalEntrySettingsController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBNumericalEntrySettingsController.java
index 98211760de2c6325d987dccdbbe1d3ad3eb9f741..1976f11b7da2a47679e74f96d9c28740ebe48d50 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBNumericalEntrySettingsController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBNumericalEntrySettingsController.java
@@ -55,11 +55,13 @@ public class FIBNumericalEntrySettingsController extends FormBasicController {
 	private SingleSelection toleranceModeEl;
 	private TextElement lowerToleranceEl, upperToleranceEl;
 	
+	private final boolean restrictedEdit;
 	private final NumericalEntry interaction;
 	
-	public FIBNumericalEntrySettingsController(UserRequest ureq, WindowControl wControl, NumericalEntry interaction) {
+	public FIBNumericalEntrySettingsController(UserRequest ureq, WindowControl wControl, NumericalEntry interaction, boolean restrictedEdit) {
 		super(ureq, wControl, Util.createPackageTranslator(AssessmentTestEditorController.class, ureq.getLocale()));
 		this.interaction = interaction;
+		this.restrictedEdit = restrictedEdit;
 		initForm(ureq);
 	}
 
@@ -68,17 +70,21 @@ public class FIBNumericalEntrySettingsController extends FormBasicController {
 		Double solution = interaction.getSolution();
 		String solString = solution == null ? "" : solution.toString();
 		solutionEl = uifactory.addTextElement("fib.solution", "fib.solution", 256, solString, formLayout);
+		solutionEl.setEnabled(!restrictedEdit);
 		String placeholder = interaction.getPlaceholder();
 		placeholderEl = uifactory.addTextElement("fib.placeholder", "fib.placeholder", 256, placeholder, formLayout);
+		placeholderEl.setEnabled(!restrictedEdit);
 		
 		Integer expectedLength = interaction.getExpectedLength();
 		String expectedLengthStr = expectedLength == null ? null : expectedLength.toString();
 		expectedLengthEl = uifactory.addTextElement("fib.expectedLength", "fib.expectedLength", 256, expectedLengthStr, formLayout);
+		expectedLengthEl.setEnabled(!restrictedEdit);
 		
 		String[] toleranceModeValues = new String[] {
 			translate("fib.tolerance.mode.exact"), translate("fib.tolerance.mode.absolute"), translate("fib.tolerance.mode.relative")
 		};
 		toleranceModeEl = uifactory.addDropdownSingleselect("fib.tolerance.mode", "fib.tolerance.mode", formLayout, toleranceModeKeys, toleranceModeValues, null);
+		toleranceModeEl.setEnabled(!restrictedEdit);
 		if(interaction.getToleranceMode() != null) {
 			for(String toleranceModeKey:toleranceModeKeys) {
 				if(toleranceModeKey.equals(interaction.getToleranceMode().name())) {
@@ -95,11 +101,13 @@ public class FIBNumericalEntrySettingsController extends FormBasicController {
 		String lowerToleranceString = lowerTolerance == null ? "" : lowerTolerance.toString();
 		lowerToleranceEl = uifactory.addTextElement("fib.tolerance.low", "fib.tolerance.low", 8, lowerToleranceString, formLayout);
 		lowerToleranceEl.setExampleKey("fib.tolerance.mode.absolute.example", null);
+		lowerToleranceEl.setEnabled(!restrictedEdit);
 		
 		Double upperTolerance = interaction.getUpperTolerance();
 		String upperToleranceString = upperTolerance == null ? "" : upperTolerance.toString();
 		upperToleranceEl = uifactory.addTextElement("fib.tolerance.up", "fib.tolerance.up", 8, upperToleranceString, formLayout);
 		upperToleranceEl.setExampleKey("fib.tolerance.mode.absolute.example", null);
+		upperToleranceEl.setEnabled(!restrictedEdit);
 		updateToleranceUpAndLow();
 
 		
@@ -107,7 +115,9 @@ public class FIBNumericalEntrySettingsController extends FormBasicController {
 		FormLayoutContainer buttonsContainer = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		buttonsContainer.setRootForm(mainForm);
 		formLayout.add(buttonsContainer);
-		uifactory.addFormSubmitButton("submit", buttonsContainer);
+		if(!restrictedEdit) {
+			uifactory.addFormSubmitButton("submit", buttonsContainer);
+		}
 		uifactory.addFormCancelButton("cancel", buttonsContainer, ureq, getWindowControl());
 	}
 	
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBTextEntrySettingsController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBTextEntrySettingsController.java
index 6297b3a572651b0a9268eb3eba382f9f4da440ea..46b441687d0244fdef3bd30aab773a5cc4810cfe 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBTextEntrySettingsController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBTextEntrySettingsController.java
@@ -49,12 +49,14 @@ public class FIBTextEntrySettingsController extends FormBasicController {
 	private TextElement expectedLengthEl;
 	private MultipleSelectionElement caseSensitiveEl;
 	
+	private final boolean restrictedEdit;
 	private final TextEntry interaction;
 	
-	public FIBTextEntrySettingsController(UserRequest ureq, WindowControl wControl, TextEntry interaction) {
+	public FIBTextEntrySettingsController(UserRequest ureq, WindowControl wControl, TextEntry interaction, boolean restrictedEdit) {
 		super(ureq, wControl);
 		setTranslator(Util.createPackageTranslator(AssessmentTestEditorController.class, getLocale()));
 		this.interaction = interaction;
+		this.restrictedEdit = restrictedEdit;
 		initForm(ureq);
 	}
 
@@ -62,18 +64,23 @@ public class FIBTextEntrySettingsController extends FormBasicController {
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		String solution = interaction.getSolution();
 		solutionEl = uifactory.addTextElement("fib.solution", "fib.solution", 256, solution, formLayout);
+		solutionEl.setEnabled(!restrictedEdit);
 		String placeholder = interaction.getPlaceholder();
 		placeholderEl = uifactory.addTextElement("fib.placeholder", "fib.placeholder", 256, placeholder, formLayout);
+		placeholderEl.setEnabled(!restrictedEdit);
 		String alternatives = interaction.alternativesToString();
 		alternativeEl = uifactory.addTextElement("fib.alternative", "fib.alternative", 256, alternatives, formLayout);
 		alternativeEl.setHelpText(translate("fib.alternative.help"));
 		alternativeEl.setHelpUrlForManualPage("Test editor QTI 2.1 in detail#details_testeditor_fragetypen_fib");
+		alternativeEl.setEnabled(!restrictedEdit);
 		
 		Integer expectedLength = interaction.getExpectedLength();
 		String expectedLengthStr = expectedLength == null ? null : expectedLength.toString();
 		expectedLengthEl = uifactory.addTextElement("fib.expectedLength", "fib.expectedLength", 256, expectedLengthStr, formLayout);
-
+		expectedLengthEl.setEnabled(!restrictedEdit);
+		
 		caseSensitiveEl = uifactory.addCheckboxesHorizontal("fib.caseSensitive", "fib.caseSensitive", formLayout, onKeys, new String[]{ "" });
+		caseSensitiveEl.setEnabled(!restrictedEdit);
 		if(interaction.isCaseSensitive()) {
 			caseSensitiveEl.select(onKeys[0], true);
 		}
@@ -82,7 +89,9 @@ public class FIBTextEntrySettingsController extends FormBasicController {
 		FormLayoutContainer buttonsContainer = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		buttonsContainer.setRootForm(mainForm);
 		formLayout.add(buttonsContainer);
-		uifactory.addFormSubmitButton("submit", buttonsContainer);
+		if(!restrictedEdit) {
+			uifactory.addFormSubmitButton("submit", buttonsContainer);
+		}
 		uifactory.addFormCancelButton("cancel", buttonsContainer, ureq, getWindowControl());
 	}
 
diff --git a/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticResourceResult.java b/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticResourceResult.java
index 4842d9cdef1c21aa89ce78e23cef0dd7dd14dc96..b5eff08a55b25cd0aca9f8a3d879dfd7f276921b 100644
--- a/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticResourceResult.java
+++ b/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticResourceResult.java
@@ -231,7 +231,7 @@ public class QTI21StatisticResourceResult implements StatisticResourceResult {
 	}
 	
 	private void buildRecursively(TestPart part, int pos, TreeNode parentNode) {
-		GenericTreeNode partNode = new GenericTreeNode(part.getIdentifier().toString());
+		GenericTreeNode partNode = new GenericTreeNode();
 		partNode.setTitle(pos + ". Test part");
 		partNode.setIconCssClass("o_icon o_qtiassessment_icon");
 		partNode.setUserObject(part);
@@ -249,7 +249,7 @@ public class QTI21StatisticResourceResult implements StatisticResourceResult {
 	}
 	
 	private TreeNode buildRecursively(AssessmentSection section, TreeNode parentNode) {
-		GenericTreeNode sectionNode = new GenericTreeNode(section.getIdentifier().toString());
+		GenericTreeNode sectionNode = new GenericTreeNode();
 		sectionNode.setTitle(section.getTitle());
 		sectionNode.setIconCssClass("o_icon o_mi_qtisection");
 		sectionNode.setUserObject(section);
@@ -274,7 +274,7 @@ public class QTI21StatisticResourceResult implements StatisticResourceResult {
 	}
 	
 	private TreeNode buildRecursively(AssessmentItemRef itemRef, TreeNode parentNode) {
-		GenericTreeNode itemNode = new GenericTreeNode(itemRef.getIdentifier().toString());
+		GenericTreeNode itemNode = new GenericTreeNode();
 		
 		ResolvedAssessmentItem resolvedAssessmentItem = resolvedAssessmentTest.getResolvedAssessmentItem(itemRef);
 		BadResourceException ex = resolvedAssessmentItem.getItemLookup().getBadResourceException();
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java
index e245434d5cc9d5884191ec04c215cbee262ac395..5ad79b061aec7963698688e9e6d566ddfedbe2b5 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/PoolsAdminController.java
@@ -19,15 +19,14 @@
  */
 package org.olat.modules.qpool.ui.admin;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 import org.olat.admin.securitygroup.gui.GroupController;
 import org.olat.admin.securitygroup.gui.IdentitiesAddEvent;
 import org.olat.admin.securitygroup.gui.IdentitiesRemoveEvent;
-import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.ResultInfos;
+import org.olat.core.commons.persistence.SortKey;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -38,14 +37,15 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.BooleanCellRenderer;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.CSSIconFlexiCellRenderer;
 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.DefaultFlexiTableDataModel;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef;
 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.FlexiTableRendererType;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent;
+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.core.gui.components.link.Link;
-import org.olat.core.gui.components.table.TableDataModel;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -60,6 +60,7 @@ import org.olat.modules.qpool.QPoolService;
 import org.olat.modules.qpool.model.PoolImpl;
 import org.olat.modules.qpool.ui.QuestionsController;
 import org.olat.modules.qpool.ui.events.QPoolEvent;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -81,12 +82,12 @@ public class PoolsAdminController extends FormBasicController {
 	private PoolEditController poolEditCtrl;
 	private DialogBoxController confirmDeleteCtrl;
 	
-	private final QPoolService qpoolService;
+	@Autowired
+	private QPoolService qpoolService;
 	
 	public PoolsAdminController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl, null, "pools_admin", Util.createPackageTranslator(QuestionsController.class, ureq.getLocale()));
-		
-		qpoolService = CoreSpringFactory.getImpl(QPoolService.class);
+
 		initForm(ureq);
 	}
 	
@@ -99,14 +100,13 @@ public class PoolsAdminController extends FormBasicController {
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		//add the table
 		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, Cols.id.i18nKey(), Cols.id.ordinal(), true, "key"));
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, Cols.publicPool.i18nKey(), Cols.publicPool.ordinal(),
-				true, "publicPool", FlexiColumnModel.ALIGNMENT_LEFT,
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(false, Cols.id));
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.publicPool,
 				new BooleanCellRenderer(
 						new CSSIconFlexiCellRenderer("o_icon_pool_public"),
 						new CSSIconFlexiCellRenderer("o_icon_pool_private"))
 		));
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.name.i18nKey(), Cols.name.ordinal(), true, "name"));
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.name));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("edit", translate("edit"), "edit-pool"));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("pool.owners", translate("pool.owners"), "owners-pool"));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel("delete", translate("delete"), "delete-pool"));
@@ -234,7 +234,7 @@ public class PoolsAdminController extends FormBasicController {
 		}
 	}
 	
-	private enum Cols {
+	private enum Cols implements FlexiSortableColumnDef {
 		id("pool.key"),
 		publicPool("pool.public"),
 		name("pool.name");
@@ -244,63 +244,41 @@ public class PoolsAdminController extends FormBasicController {
 		private Cols(String i18nKey) {
 			this.i18nKey = i18nKey;
 		}
-		
-		public String i18nKey() {
+
+		@Override
+		public String i18nHeaderKey() {
 			return i18nKey;
 		}
+
+		@Override
+		public boolean sortable() {
+			return true;
+		}
+
+		@Override
+		public String sortKey() {
+			return name();
+		}
 	}
 	
-	private static class PoolDataModel implements FlexiTableDataModel<Pool>, TableDataModel<Pool> {
-	
-		private List<Pool> rows;
+	private static class PoolDataModel extends DefaultFlexiTableDataModel<Pool> implements SortableFlexiTableDataModel<Pool> {
+
 		private FlexiTableColumnModel columnModel;
 		private final Translator translator;
 		
 		public PoolDataModel(FlexiTableColumnModel columnModel, Translator translator) {
-			this.columnModel = columnModel;
+			super(columnModel);
 			this.translator = translator;
 		}
 		
 		@Override
-		public FlexiTableColumnModel getTableColumnModel() {
-			return columnModel;
-		}
-	
-		@Override
-		public void setTableColumnModel(FlexiTableColumnModel tableColumnModel) {
-			this.columnModel = tableColumnModel;
-		}
-	
-		@Override
-		public int getRowCount() {
-			return rows == null ? 0 : rows.size();
-		}
-		
-		@Override
-		public boolean isSelectable(int row) {
-			return true;
+		public void sort(SortKey orderBy) {
+			if(orderBy != null) {
+				List<Pool> views = new SortableFlexiTableModelDelegate<Pool>(orderBy, this, translator.getLocale()).sort();
+				super.setObjects(views);
+			}
 		}
 
-		@Override
-		public boolean isRowLoaded(int row) {
-			return rows != null && row < rows.size();
-		}
-	
-		@Override
-		public Pool getObject(int row) {
-			return rows.get(row);
-		}
-	
-		@Override
-		public void setObjects(List<Pool> objects) {
-			rows = new ArrayList<Pool>(objects);
-		}
-	
-		@Override
-		public int getColumnCount() {
-			return columnModel.getColumnCount();
-		}
-		
 		@Override
 		public PoolDataModel createCopyWithEmptyList() {
 			return new PoolDataModel(columnModel, translator);
@@ -308,11 +286,16 @@ public class PoolsAdminController extends FormBasicController {
 	
 		@Override
 		public Object getValueAt(int row, int col) {
-			Pool item = getObject(row);
+			Pool pool = getObject(row);
+			return getValueAt(pool, col);
+		}
+		
+		@Override
+		public Object getValueAt(Pool pool, int col) {
 			switch(Cols.values()[col]) {
-				case id: return item.getKey();
-				case publicPool: return new Boolean(item.isPublicPool());
-				case name: return item.getName();
+				case id: return pool.getKey();
+				case publicPool: return new Boolean(pool.isPublicPool());
+				case name: return pool.getName();
 				default: return "";
 			}
 		}
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_de.properties
index f482654e37b42178ed1ac25d428456c7607f9e96..82f509adee9cba5b2d2d26da864c51a6a9d8661c 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_de.properties
@@ -423,6 +423,7 @@ table.name.privateEmail=E-Mail (Privat)
 table.name.rank=Dienstgrad / Amtsbezeichnung
 table.name.region=Region
 table.name.skype=Skype ID
+table.name.smsTelMobile=SMS Nummer
 table.name.street=Strasse
 table.name.studySubject=Studienfach
 table.name.telMobile=Telefon Mobil
diff --git a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_en.properties
index fd0748cfc5f957db7b2651884dfc943ba3e57e5d..0d2ad752cdea35509a4af2a3059c70bb6045951b 100644
--- a/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/user/propertyhandlers/_i18n/LocalStrings_en.properties
@@ -423,6 +423,7 @@ table.name.privateEmail=E-mail (private)
 table.name.rank=Service grade / employment title
 table.name.region=Region
 table.name.skype=Skype ID
+table.name.smsTelMobile=SMS number
 table.name.street=Street
 table.name.studySubject=Field of studies
 table.name.telMobile=Phone mobile