diff --git a/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java b/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java
index 2675429b5b77f4f57c909254d8c124424df6905f..eb7fd68d8825b35ef1f284481c1a459529e0071c 100644
--- a/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java
+++ b/src/main/java/org/olat/admin/site/ui/SitesConfigurationController.java
@@ -146,6 +146,8 @@ public class SitesConfigurationController extends FormBasicController {
 		
 		tableEl = uifactory.addTableElement(ureq, getWindowControl(), "sitesTable", model, getTranslator(), formLayout);
 		tableEl.setRendererType(FlexiTableRendererType.classic);
+		tableEl.setCustomizeColumns(true);
+		tableEl.setAndLoadPersistedPreferences(ureq, "sites-admin");
 		
 		reload(ureq);
 	}
diff --git a/src/main/java/org/olat/admin/user/ExtendedIdentitiesTableControllerFactory.java b/src/main/java/org/olat/admin/user/ExtendedIdentitiesTableControllerFactory.java
index 643332cb140267eaff32aa9a3a3f249e94f1942c..63e539a431aa848a0e4881334bf6aa2e269a487e 100644
--- a/src/main/java/org/olat/admin/user/ExtendedIdentitiesTableControllerFactory.java
+++ b/src/main/java/org/olat/admin/user/ExtendedIdentitiesTableControllerFactory.java
@@ -55,7 +55,7 @@ public class ExtendedIdentitiesTableControllerFactory {
 	/**
 	 * @param args
 	 */
-	public static TableController createController(ExtendedIdentitiesTableDataModel dataModel, UserRequest ureq, WindowControl wControl, boolean actionEnabled) {
+	public static TableController createController(ExtendedIdentitiesTableDataModel dataModel, UserRequest ureq, WindowControl wControl) {
 		Locale loc = ureq.getLocale();
 		Translator trans = Util.createPackageTranslator(ExtendedIdentitiesTableControllerFactory.class, loc);
 		TableGuiConfiguration tableConfig = new TableGuiConfiguration();
diff --git a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java
index 16837364682a9addeb28d960aad20673f121f5cb..a6a9d5ed3298201a07d53e3bacc836893a0e1100 100644
--- a/src/main/java/org/olat/admin/user/UserSearchFlexiController.java
+++ b/src/main/java/org/olat/admin/user/UserSearchFlexiController.java
@@ -225,6 +225,7 @@ public class UserSearchFlexiController extends FlexiAutoCompleterController {
 			Translator myTrans = userManager.getPropertyHandlerTranslator(getTranslator());
 			userTableModel = new UserSearchFlexiTableModel(Collections.<UserResultWrapper>emptyList(), resultingPropertyHandlers, isAdministrativeUser, getLocale(), tableColumnModel);
 			tableEl = uifactory.addTableElement(ureq, getWindowControl(), "users", userTableModel, myTrans, formLayout);
+			tableEl.setCustomizeColumns(false);
 
 			selectAll = uifactory.addFormLink("selectall", formLayout);
 			deselectAll = uifactory.addFormLink("deselectall", formLayout);
diff --git a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
index 6bd0874da9c2550bb439694c6f26a9a5c4456405..43fa729e7a2e5fe9ec194214256d8ba83e1465dd 100644
--- a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
+++ b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
@@ -327,7 +327,7 @@ public class UsermanagerUserSearchController extends BasicController implements
 		OLATResourceable ores = OresHelper.createOLATResourceableInstance("table", 0l);
 		ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 		WindowControl bwControl = addToHistory(ureq, ores, null);
-		tableCtr = ExtendedIdentitiesTableControllerFactory.createController(tdm, ureq, bwControl, actionEnabled);
+		tableCtr = ExtendedIdentitiesTableControllerFactory.createController(tdm, ureq, bwControl);
 		listenTo(tableCtr);
 		
 		if (showEmailButton) {
diff --git a/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java b/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java
index 1a251b6cf7a14299dd377d1d8f5baa1628ae2102..5a5c6f1ce18b8c5141879d58c1de4de81060d954 100644
--- a/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java
+++ b/src/main/java/org/olat/admin/user/groups/GroupOverviewController.java
@@ -119,7 +119,7 @@ public class GroupOverviewController extends BasicController {
 		tableDataModel = new BusinessGroupTableModelWithType(getTranslator(), 4);
 		groupListCtr.setTableDataModel(tableDataModel);
 		
-		updateModel(ureq);
+		updateModel();
 		
 		addGroups = LinkFactory.createButton("add.groups", vc, this);		
 		vc.put("table.groups", groupListCtr.getInitialComponent());	
@@ -132,7 +132,7 @@ public class GroupOverviewController extends BasicController {
 	 * @param identity
 	 * @return
 	 */
-	private void updateModel(UserRequest ureq) {
+	private void updateModel() {
 		SearchBusinessGroupParams params = new SearchBusinessGroupParams();
 		params.setIdentity(identity);
 		params.setOwner(true);
@@ -203,7 +203,7 @@ public class GroupOverviewController extends BasicController {
 				if (currBusinessGroup==null) {
 					//group seems to be removed meanwhile, reload table and show error
 					showError("group.removed");
-					updateModel(ureq);	
+					updateModel();	
 				} else if (TABLE_ACTION_LAUNCH.equals(te.getActionId())) {
 					NewControllerFactory.getInstance().launch("[BusinessGroup:" + currBusinessGroup.getKey() + "]", ureq, getWindowControl());
 				} else if (TABLE_ACTION_UNSUBSCRIBE.equals(te.getActionId())){
@@ -230,7 +230,7 @@ public class GroupOverviewController extends BasicController {
 				boolean mailMandatory = groupModule.isMandatoryEnrolmentEmail(ureq.getUserSession().getRoles());
 				if(mailMandatory) {
 					doAddToGroups(groupsEv, true);
-					updateModel(ureq);
+					updateModel();
 				} else {
 					confirmSendMailBox = activateYesNoDialog(ureq, null, translate("dialog.modal.bg.send.mail"), confirmSendMailBox);
 					confirmSendMailBox.setUserObject(groupsEv);
@@ -241,7 +241,7 @@ public class GroupOverviewController extends BasicController {
 			boolean sendMail = DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event);
 			AddToGroupsEvent groupsEv = (AddToGroupsEvent)confirmSendMailBox.getUserObject();
 			doAddToGroups(groupsEv, sendMail);
-			updateModel(ureq);
+			updateModel();
 		} else if (source == removeFromGrpDlg){
 			if(event == Event.DONE_EVENT) {
 				boolean sendMail = removeFromGrpDlg.isSendMail();
@@ -331,7 +331,7 @@ public class GroupOverviewController extends BasicController {
 			}
 		}
 
-		updateModel(ureq);
+		updateModel();
 
 		StringBuilder groupNames = new StringBuilder();
 		for(BusinessGroup group:groupsToLeave) {
diff --git a/src/main/java/org/olat/admin/user/groups/GroupSearchController.java b/src/main/java/org/olat/admin/user/groups/GroupSearchController.java
index 8ee3bf48d1e3c96b56bca8094945666aaf4ff4d0..d8c36c8ad06cdfb8e7ad47090a39ceabe8e80266 100644
--- a/src/main/java/org/olat/admin/user/groups/GroupSearchController.java
+++ b/src/main/java/org/olat/admin/user/groups/GroupSearchController.java
@@ -143,6 +143,7 @@ public class GroupSearchController extends StepFormBasicController {
 		
 		tableDataModel = new GroupTableDataModel(Collections.<GroupWrapper>emptyList(), tableColumnModel);
 		table = uifactory.addTableElement(ureq, getWindowControl(), "groupList", tableDataModel, tableCont);
+		table.setCustomizeColumns(false);
 		tableCont.add("groupList", table);
 		
 		if (!isUsedInStepWizzard()) {
@@ -155,7 +156,7 @@ public class GroupSearchController extends StepFormBasicController {
 	 */
 	@Override
 	protected void formOK(UserRequest ureq) {
-		doSearchGroups(ureq);
+		doSearchGroups();
 	}
 	
 	@Override
@@ -171,7 +172,7 @@ public class GroupSearchController extends StepFormBasicController {
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (source == searchButton || source == searchLink || source == search) {
-			doSearchGroups(ureq);
+			doSearchGroups();
 		} else if(source == saveLink) {
 			if(validateFormLogic(ureq)) {
 				doSave(ureq);
@@ -181,9 +182,9 @@ public class GroupSearchController extends StepFormBasicController {
 		}
 	}
 	
-	private void doSearchGroups(UserRequest ureq) {
+	private void doSearchGroups() {
 		String searchValue = search.getValue();
-		doSearchGroups(searchValue, ureq);
+		doSearchGroups(searchValue);
 		lastSearchValue = searchValue;
 	}
 
@@ -194,7 +195,7 @@ public class GroupSearchController extends StepFormBasicController {
 	 * @param searchValue
 	 * @param ureq
 	 */
-	private void doSearchGroups(String searchValue, UserRequest ureq) {	
+	private void doSearchGroups(String searchValue) {	
 		if (StringHelper.containsNonWhitespace(searchValue)) {
 			SearchBusinessGroupParams param1s = new SearchBusinessGroupParams();
 			param1s.setNameOrDesc(searchValue);
@@ -267,7 +268,7 @@ public class GroupSearchController extends StepFormBasicController {
 				|| (lastSearchValue != null && !lastSearchValue.equals(searchValue))) {
 			// User pressed enter in input field to search for groups, no group
 			// selected yet. Just search for groups that matches for this input
-			doSearchGroups(searchValue, ureq);
+			doSearchGroups(searchValue);
 			lastSearchValue = searchValue;
 			return false;
 		}
diff --git a/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties
index 1dce43769c3fd9f860aaf07dfc3cfeafd04fae5e..6f9148543cb6fb9d78f183eb0462e26735d789af 100644
--- a/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/core/_i18n/LocalStrings_de.properties
@@ -61,6 +61,7 @@ rating.5.3=$\:rating.2.2
 rating.5.4=$\:rating.4.4
 rating.5.5=Hervorragend
 rating.explanation=Klicken Sie um zu bewerten
+reset=Reset
 save=Speichern
 save.close=Speichern und schliessen
 savesas=Speichern unter
diff --git a/src/main/java/org/olat/core/gui/components/choice/Choice.java b/src/main/java/org/olat/core/gui/components/choice/Choice.java
index 70f455ed407baf708dafd95aea59a06ba620c937..240885e146e48b401151b8e700fc612b6dc345ff 100644
--- a/src/main/java/org/olat/core/gui/components/choice/Choice.java
+++ b/src/main/java/org/olat/core/gui/components/choice/Choice.java
@@ -33,7 +33,6 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.components.table.Table;
-import org.olat.core.gui.components.table.TableDataModel;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
@@ -46,26 +45,18 @@ import org.olat.core.util.Util;
 public class Choice extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new ChoiceRenderer();
 
-	/**
-	 * Comment for <code>EVENT_VALIDATION_OK</code>
-	 */
 	public static final Event EVNT_VALIDATION_OK = new Event("validation ok");
-	/**
-	 * Comment for <code>EVENT_FORM_CANCELLED</code>
-	 */
 	public static final Event EVNT_FORM_CANCELLED = new Event("form_cancelled");
-	/**
-	 * Comment for <code>CANCEL_IDENTIFICATION</code>
-	 */
+	public static final Event EVNT_FORM_RESETED = new Event("form_reseted");
 	public static final String CANCEL_IDENTIFICATION = "olat_foca";
+	public static final String RESET_IDENTIFICATION = "olat_fore";
 
-	private String submitKey;
-	private String cancelKey;
+	private String submitKey, cancelKey, resetKey;
 	private boolean displayOnly = false;
 	private List<Integer> selectedRows = new ArrayList<Integer>();
 	private List<Integer> removedRows = new ArrayList<Integer>();
 	private List<Integer> addedRows = new ArrayList<Integer>();
-	private TableDataModel<?> tableDataModel;
+	private ChoiceModel model;
 
 	/**
 	 * @param name of the component
@@ -85,21 +76,24 @@ public class Choice extends AbstractComponent {
 	/**
 	 * @see org.olat.core.gui.components.Component#dispatchRequest(org.olat.core.gui.UserRequest)
 	 */
+	@Override
 	protected void doDispatchRequest(UserRequest ureq) {
 		// since we are a >form<, this must be a submit or a cancel
 		// check for cancel first
 		if (ureq.getParameter(CANCEL_IDENTIFICATION) != null) {
 			fireEvent(ureq, EVNT_FORM_CANCELLED);
+		} else if (ureq.getParameter(RESET_IDENTIFICATION) != null) {
+			fireEvent(ureq, EVNT_FORM_RESETED);
 		} else {
 			selectedRows.clear();
 			removedRows.clear();
 			addedRows.clear();
 			// standard behavior: set all values, validate, and fire Event
-			int size = tableDataModel.getRowCount();
+			int size = model.getRowCount();
 			for (int i = 0; i < size; i++) {
 				String keyN = "c" + i;
 				String exists = ureq.getParameter(keyN);
-				Boolean oldV = (Boolean) tableDataModel.getValueAt(i, 0); // column 0
+				Boolean oldV = model.isEnabled(i); // column 0
 				// must always
 				// return a
 				// Boolean
@@ -125,41 +119,29 @@ public class Choice extends AbstractComponent {
 			fireEvent(ureq, EVNT_VALIDATION_OK);
 		}
 	}
+	
+	public String getSubmitKey() {
+		return submitKey;
+	}
 
-	/**
-	 * @return String
-	 */
+	public void setSubmitKey(String string) {
+		submitKey = string;
+	}
+	
 	public String getCancelKey() {
 		return cancelKey;
 	}
 
-	/**
-	 * @return String
-	 */
-	public String getSubmitKey() {
-		return submitKey;
-	}
-
-	/**
-	 * @param string
-	 */
 	public void setCancelKey(String string) {
 		cancelKey = string;
 	}
 
-	/**
-	 * @param string
-	 */
-	public void setSubmitKey(String string) {
-		submitKey = string;
+	public String getResetKey() {
+		return resetKey;
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.Component#getExtendedDebugInfo()
-	 */
-	public String getExtendedDebugInfo() {
-		return "choice: "
-				+ (tableDataModel == null ? "no model!" : "rows:" + tableDataModel.getRowCount() + ", cols:" + tableDataModel.getColumnCount());
+	public void setResetKey(String resetKey) {
+		this.resetKey = resetKey;
 	}
 
 	/**
@@ -186,8 +168,8 @@ public class Choice extends AbstractComponent {
 	/**
 	 * @return TableDataModel
 	 */
-	public TableDataModel<?> getTableDataModel() {
-		return tableDataModel;
+	public ChoiceModel getModel() {
+		return model;
 	}
 
 	/**
@@ -198,8 +180,8 @@ public class Choice extends AbstractComponent {
 	 * 
 	 * @param model
 	 */
-	public void setTableDataModel(TableDataModel<?> model) {
-		tableDataModel = model;
+	public void setModel(ChoiceModel model) {
+		this.model = model;
 	}
 
 	/**
@@ -217,7 +199,13 @@ public class Choice extends AbstractComponent {
 		return removedRows;
 	}
 
+	@Override
 	public ComponentRenderer getHTMLRendererSingleton() {
 		return RENDERER;
 	}
+	
+	@Override
+	public String getExtendedDebugInfo() {
+		return "choice: " + (model == null ? "no model!" : "rows:" + model.getRowCount());
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/components/choice/ChoiceModel.java b/src/main/java/org/olat/core/gui/components/choice/ChoiceModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..859771e6f0a96a966467263918a60c896cf00422
--- /dev/null
+++ b/src/main/java/org/olat/core/gui/components/choice/ChoiceModel.java
@@ -0,0 +1,38 @@
+/**
+ * <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.core.gui.components.choice;
+
+/**
+ * 
+ * Initial date: 27.05.2014<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public interface ChoiceModel {
+	
+	public int getRowCount();
+	
+	public Boolean isEnabled(int row);
+	
+	public String getLabel(int row);
+	
+	public boolean isDisabled(int row);
+
+}
diff --git a/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java b/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java
index 26e72a36af4bcea11af0795cd4d7bdeabedadcfb..3b84a384ded4d0541be67b1f5aac3ec12be26d34 100644
--- a/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/choice/ChoiceRenderer.java
@@ -29,7 +29,6 @@ package org.olat.core.gui.components.choice;
 import org.apache.commons.lang.StringEscapeUtils;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.DefaultComponentRenderer;
-import org.olat.core.gui.components.table.TableDataModel;
 import org.olat.core.gui.control.winmgr.AJAXFlags;
 import org.olat.core.gui.render.RenderResult;
 import org.olat.core.gui.render.Renderer;
@@ -56,7 +55,7 @@ public class ChoiceRenderer extends DefaultComponentRenderer {
 
 		// Get the model object
 		Choice choice = (Choice) source;
-		TableDataModel<?> tdm = choice.getTableDataModel();
+		ChoiceModel model = choice.getModel();
 
 		boolean iframePostEnabled = renderer.getGlobalSettings().getAjaxFlags().isIframePostEnabled();
 		// form header
@@ -70,31 +69,26 @@ public class ChoiceRenderer extends DefaultComponentRenderer {
 		target.append(">");
 
 		target.append("<table class=\"b_choice\">");
-		int rows = tdm.getRowCount();
-		int cols = tdm.getColumnCount();
-
+		int rows = model.getRowCount();
 		for (int i = 0; i < rows; i++) {
-			target.append("<tr>");
-			for (int j = 0; j < cols; j++) {
-				Object val = tdm.getValueAt(i, j);
-				if (j == 0) { // column with on/off Boolean
-					target.append("<td class=\"b_choice_checkrow\">");
-					boolean selected = ((Boolean) val).booleanValue();
-					String keyN = "c" + i;
-					target.append("<input type=\"checkbox\" class=\"b_checkbox\"");
-					if (selected) target.append(" checked=\"checked\"");
-					target.append(" name=\"").append(keyN).append("\" onchange=\"return setFormDirty('").append(id).append("')\"  />");
-				} else { // regular row, dump value
-					target.append("<td class=\"b_choice_textrow\">");
-					String sVal = val.toString();
-					target.append(StringEscapeUtils.escapeHtml(sVal));					
-				}
-				target.append("</td>");
-			}
-			target.append("</tr>");
+			Boolean val = model.isEnabled(i);
+			boolean selected = val == null ? false : val.booleanValue();
+			boolean disabled = model.isDisabled(i);
+			
+			String keyN = "c" + i;
+			target.append("<tr><td class='b_choice_checkrow'><input type='checkbox' class='b_checkbox'")
+			      .append(" checked='checked'", selected)
+			      .append(" disabled='disabled'", disabled)
+			      .append(" name='").append(keyN).append("' onchange=\"return setFormDirty('").append(id).append("')\"  />")
+			      .append("</td>");
+			
+			String label = model.getLabel(i);
+			target.append("<td class='b_choice_textrow'>")
+			      .append(StringEscapeUtils.escapeHtml(label))
+			      .append("</td></tr>");
 		}
 		// Toggle all on/off
-		target.append("<tr><td colspan=\"").append(cols).append("\" class=\"b_togglecheck\">")
+		target.append("<tr><td colspan='2' class=\"b_togglecheck\">")
 		      .append("<div class=\"b_togglecheck\">")
 		      .append("<a href=\"#\" onclick=\"javascript:b_choice_toggleCheck('" + id + "', true)\">")
 		      .append("<input type=\"checkbox\" checked=\"checked\" disabled=\"disabled\" />")
@@ -102,19 +96,29 @@ public class ChoiceRenderer extends DefaultComponentRenderer {
 		      .append("</a> <a href=\"#\" onclick=\"javascript:b_choice_toggleCheck('" + id + "', false)\">")
 		      .append("<input type=\"checkbox\" disabled=\"disabled\" />")
 		      .append(translator.translate("uncheckall"))
-		      .append("</a></div>")
-		      .append("</td></tr>");
-
+		      .append("</a></div></td></tr>");
+		
+		//buttons
+		target.append("<tr><td colspan='2'><div class='btn-group'>");
 		// Submit button
-		target.append("<tr><td colspan=\"").append(cols).append("\"><div class=\"b_button_group\">");
-		target.append("<input type=\"submit\" name=\"olat_fosm\" value=\"" + StringEscapeUtils.escapeHtml(translator.translate(choice.getSubmitKey()))
-				+ "\" class=\"btn btn-default\" />");
+		target.append("<input type='submit' name='olat_fosm' value=\"")
+		      .append(StringEscapeUtils.escapeHtml(translator.translate(choice.getSubmitKey())))
+		      .append("\" class='btn btn-primary' />");
 
+		//Reset button
+		String resetKey = choice.getResetKey();
+		if (resetKey != null) {
+			target.append("<input type='submit' name='").append(Choice.RESET_IDENTIFICATION)
+			      .append("' value=\"").append(StringEscapeUtils.escapeHtml(translator.translate(resetKey)))
+			      .append("\" class='btn btn-default' />");
+		}
+		
 		// Cancel button
 		String cancelKey = choice.getCancelKey();
 		if (cancelKey != null) {
-			target.append("<input type=\"submit\" name=\"" + Choice.CANCEL_IDENTIFICATION + "\" value=\""
-					+ StringEscapeUtils.escapeHtml(translator.translate(cancelKey)) + "\" class=\"btn btn-default\" />");
+			target.append("<input type='submit' name='").append(Choice.CANCEL_IDENTIFICATION)
+			      .append("' value=\"").append(StringEscapeUtils.escapeHtml(translator.translate(cancelKey)))
+			      .append("\" class='btn btn-default' />");
 		}
 		target.append("</div></td></tr></table></form>");
 	}
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java
index 0399a20320c5a4d75231f7fbe7b263846838cc2d..9ce358183f1726e42d707326f4865dfb5893f3b6 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/elements/FlexiTableElement.java
@@ -93,6 +93,14 @@ public interface FlexiTableElement extends FormItem {
 	 */
 	public void setCustomizeColumns(boolean customizeColumns);
 	
+	/**
+	 * Set the id of the preferences saved on the database.
+	 * 
+	 * @param ureq
+	 * @param id
+	 */
+	public void setAndLoadPersistedPreferences(UserRequest ureq, String id);
+	
 	/**
 	 * @return The CSS selector used to calculate the height of the table
 	 * (datatables variant only)
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiColumnModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiColumnModel.java
index 2cdfc00607943abbba375cbe1ea96e0a96aaba53..1d0d55d88999b5624a1cdd2188a796f4bafd7ea3 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiColumnModel.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/AbstractFlexiColumnModel.java
@@ -25,7 +25,7 @@ package org.olat.core.gui.components.form.flexible.impl.elements.table;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-public class AbstractFlexiColumnModel implements FlexiColumnModel {
+public abstract class AbstractFlexiColumnModel implements FlexiColumnModel {
 
 	private int alignment;
 	private String headerKey;
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiColumnModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiColumnModel.java
index 46b5c518e591cd162dc483915f583063c14d9bf1..0e36a7b695017e475ee02065a6610e63b4f3204e 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiColumnModel.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/DefaultFlexiColumnModel.java
@@ -71,6 +71,11 @@ public class DefaultFlexiColumnModel implements FlexiColumnModel {
 		this.cellRenderer = cellRenderer;
 	}
 
+	@Override
+	public boolean isAlwaysVisible() {
+		return false;
+	}
+
 	@Override
 	public String getAction() {
 		return null;
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiColumnModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiColumnModel.java
index 17a38b18bf7da066927f9026539422dc07a3dd3f..8ffc95477e4ab30beb7bc8e91ac9f9e0782dd68f 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiColumnModel.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiColumnModel.java
@@ -37,12 +37,16 @@ public interface FlexiColumnModel {
 	public static int ALIGNMENT_RIGHT = 2;
 	public static int ALIGNMENT_CENTER = 3;
 	
+
+	
 	public boolean isSortable();
 	
 	public void setSortable(boolean enable);
 	
 	public boolean isDefaultVisible();
 	
+	public boolean isAlwaysVisible();
+	
 	public String getSortKey();
 
 	public void setSortKey(String sortedKey);
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
index 33d77289f6d0bb7ac66058dc76771d7463facb65..d7d86650e11ba61534e4a002e8853e1dcfa2425f 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java
@@ -44,10 +44,10 @@ import org.olat.core.gui.components.ComponentEventListener;
 import org.olat.core.gui.components.choice.Choice;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemCollection;
-import org.olat.core.gui.components.form.flexible.elements.FlexiTableSortOptions;
 import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement;
 import org.olat.core.gui.components.form.flexible.elements.FlexiTableFilter;
 import org.olat.core.gui.components.form.flexible.elements.FlexiTableSort;
+import org.olat.core.gui.components.form.flexible.elements.FlexiTableSortOptions;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
 import org.olat.core.gui.components.form.flexible.elements.TextElement;
 import org.olat.core.gui.components.form.flexible.impl.Form;
@@ -66,6 +66,7 @@ import org.olat.core.gui.media.MediaResource;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.ValidationStatus;
+import org.olat.core.util.prefs.Preferences;
 
 
 /**
@@ -75,6 +76,8 @@ import org.olat.core.util.ValidationStatus;
  */
 public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableElement, FormItemCollection,
 	ControllerEventListener, ComponentEventListener {
+	
+	//private static final XStream prefsXStream 
 
 	//settings
 	private boolean multiSelect;
@@ -83,6 +86,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		FlexiTableRendererType.classic
 	};
 	
+	private String persistentId;
 	private boolean customizeColumns = true;
 	
 	private int rowCount = -1;
@@ -262,18 +266,28 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		this.multiSelect = multiSelect;
 	}
 
+	@Override
 	public boolean isCustomizeColumns() {
 		return customizeColumns;
 	}
 
+	@Override
 	public void setCustomizeColumns(boolean customizeColumns) {
 		this.customizeColumns = customizeColumns;
 	}
 
+	@Override
+	public void setAndLoadPersistedPreferences(UserRequest ureq, String id) {
+		persistentId = id;
+		loadCustomSettings(ureq);
+	}
+
+	@Override
 	public String getWrapperSelector() {
 		return wrapperSelector;
 	}
 
+	@Override
 	public void setWrapperSelector(String wrapperSelector) {
 		this.wrapperSelector = wrapperSelector;
 	}
@@ -645,12 +659,15 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		} else if(customTypeButton != null
 				&& customTypeButton.getFormDispatchId().equals(dispatchuri)) {
 			setRendererType(FlexiTableRendererType.custom);
+			saveCustomSettings(ureq);
 		} else if(classicTypeButton != null
 				&& classicTypeButton.getFormDispatchId().equals(dispatchuri)) {
 			setRendererType(FlexiTableRendererType.classic);
+			saveCustomSettings(ureq);
 		} else if(dataTablesTypeButton != null
 				&& dataTablesTypeButton.getFormDispatchId().equals(dispatchuri)) {
 			setRendererType(FlexiTableRendererType.dataTables);
+			saveCustomSettings(ureq);
 		} else {
 			FlexiTableColumnModel colModel = dataModel.getTableColumnModel();
 			for(int i=colModel.getColumnCount(); i-->0; ) {
@@ -685,8 +702,12 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 	@Override
 	public void dispatchEvent(UserRequest ureq, Component source, Event event) {
 		if(source instanceof Choice) {
-			Choice visibleColsChoice = (Choice)source;
-			setCustomizedColumns(visibleColsChoice);
+			if(Choice.EVNT_VALIDATION_OK.equals(event)) {
+				Choice visibleColsChoice = (Choice)source;
+				setCustomizedColumns(ureq, visibleColsChoice);
+			} else if(Choice.EVNT_FORM_RESETED.equals(event)) {
+				resetCustomizedColumns(ureq);
+			}
 			callout.deactivate();
 		}
 	}
@@ -790,7 +811,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 
 	@Override
 	public boolean isColumnModelVisible(FlexiColumnModel col) {
-		return enabledColumnIndex.contains(col.getColumnIndex());
+		return col.isAlwaysVisible() || enabledColumnIndex.contains(col.getColumnIndex());
 	}
 
 	@Override
@@ -805,10 +826,10 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 		}
 	}
 	
-	protected void setCustomizedColumns(Choice visibleColsChoice) {
+	protected void setCustomizedColumns(UserRequest ureq, Choice visibleColsChoice) {
 		List<Integer> visibleCols = visibleColsChoice.getSelectedRows();
 		if(visibleCols.size() > 1) {
-			VisibleFlexiColumnsModel model = (VisibleFlexiColumnsModel)visibleColsChoice.getTableDataModel();
+			VisibleFlexiColumnsModel model = (VisibleFlexiColumnsModel)visibleColsChoice.getModel();
 			for(int i=model.getRowCount(); i-->0; ) {
 				FlexiColumnModel col = model.getObject(i);
 				if(visibleCols.contains(new Integer(i))) {
@@ -818,15 +839,56 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle
 				}
 			}
 		}
+		saveCustomSettings(ureq);
+		component.setDirty(true);
+	}
+	
+	protected void resetCustomizedColumns(UserRequest ureq) {
+		enabledColumnIndex.clear();
+		for(int i=dataModel.getTableColumnModel().getColumnCount(); i-->0; ) {
+			FlexiColumnModel col = dataModel.getTableColumnModel().getColumnModel(i);
+			if(col.isDefaultVisible()) {
+				enabledColumnIndex.add(new Integer(col.getColumnIndex()));
+			}
+		}
+		saveCustomSettings(ureq);
 		component.setDirty(true);
+	} 
+	
+	private void saveCustomSettings(UserRequest ureq) {
+		if(StringHelper.containsNonWhitespace(persistentId)) {
+			Preferences prefs = ureq.getUserSession().getGuiPreferences();
+			FlexiTablePreferences tablePrefs =
+					new FlexiTablePreferences(enabledColumnIndex, rendererType);
+			prefs.put(FlexiTableElement.class, persistentId, tablePrefs);
+			prefs.save();
+		}
+	}
+	
+	private void loadCustomSettings(UserRequest ureq) {
+		if(StringHelper.containsNonWhitespace(persistentId)) {
+			Preferences prefs = ureq.getUserSession().getGuiPreferences();
+			FlexiTablePreferences tablePrefs = (FlexiTablePreferences)prefs.get(FlexiTableElement.class, persistentId);
+			if(tablePrefs != null) {
+				if(tablePrefs.getEnabledColumnIndex() != null) {
+					enabledColumnIndex.clear();
+					enabledColumnIndex.addAll(tablePrefs.getEnabledColumnIndex());
+				}
+				
+				if(tablePrefs.getRendererType() != null) {
+					setRendererType(tablePrefs.getRendererType());
+				}
+			}
+		}
 	}
 	
 	private Choice getColumnListAndTheirVisibility() {
 		Choice choice = new Choice("colchoice", getTranslator());
-		choice.setTableDataModel(new VisibleFlexiColumnsModel(dataModel.getTableColumnModel(), enabledColumnIndex, getTranslator()));
+		choice.setModel(new VisibleFlexiColumnsModel(dataModel.getTableColumnModel(), enabledColumnIndex, getTranslator()));
 		choice.addListener(this);
 		choice.setCancelKey("cancel");
 		choice.setSubmitKey("save");
+		choice.setResetKey("reset");
 		return choice;
 	}
 
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTablePreferences.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTablePreferences.java
new file mode 100644
index 0000000000000000000000000000000000000000..44673e7b27ae7f6871f4e8e715e352676bcf0e23
--- /dev/null
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTablePreferences.java
@@ -0,0 +1,57 @@
+/**
+ * <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.core.gui.components.form.flexible.impl.elements.table;
+
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ * 
+ * Initial date: 27.05.2014<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class FlexiTablePreferences implements Serializable {
+
+	private static final long serialVersionUID = 220256298006571339L;
+	private Set<Integer> enabledColumnIndex;
+	private FlexiTableRendererType rendererType;
+	
+	public FlexiTablePreferences(Set<Integer> enabledColumnIndex, FlexiTableRendererType rendererType) {
+		this.enabledColumnIndex = enabledColumnIndex;
+		this.rendererType = rendererType;
+	}
+
+	public Set<Integer> getEnabledColumnIndex() {
+		return enabledColumnIndex;
+	}
+
+	public void setEnabledColumnIndex(Set<Integer> enabledColumnIndex) {
+		this.enabledColumnIndex = enabledColumnIndex;
+	}
+
+	public FlexiTableRendererType getRendererType() {
+		return rendererType;
+	}
+
+	public void setRendererType(FlexiTableRendererType rendererType) {
+		this.rendererType = rendererType;
+	}
+}
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/StaticFlexiColumnModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/StaticFlexiColumnModel.java
index 43cf35116005b7f6d7edf1caac37d2bee307e8d2..d6a6b9e863c3c2afb5ded834e6d89a7be8937060 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/StaticFlexiColumnModel.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/StaticFlexiColumnModel.java
@@ -57,6 +57,11 @@ public class StaticFlexiColumnModel extends AbstractFlexiColumnModel {
 		this.action = action;
 	}
 
+	@Override
+	public boolean isAlwaysVisible() {
+		return true;
+	}
+
 	@Override
 	public String getAction() {
 		return action;
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/VisibleFlexiColumnsModel.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/VisibleFlexiColumnsModel.java
index 2199d0db8d5bea5a0edc20ead23ae3c72a8f4ef0..8aa35bae48ca82f6b57b12cb460720af7baa260e 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/VisibleFlexiColumnsModel.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/VisibleFlexiColumnsModel.java
@@ -20,10 +20,9 @@
 package org.olat.core.gui.components.form.flexible.impl.elements.table;
 
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
-import org.olat.core.gui.components.table.TableDataModel;
+import org.olat.core.gui.components.choice.ChoiceModel;
 import org.olat.core.gui.translator.Translator;
 
 /**
@@ -32,7 +31,7 @@ import org.olat.core.gui.translator.Translator;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-public class VisibleFlexiColumnsModel implements TableDataModel<FlexiColumnModel> {
+public class VisibleFlexiColumnsModel implements ChoiceModel {
 	
 	private Set<Integer> enabledCols = new HashSet<Integer>();
 	private final Translator translator;
@@ -44,45 +43,33 @@ public class VisibleFlexiColumnsModel implements TableDataModel<FlexiColumnModel
 		this.enabledCols = new HashSet<Integer>(enabledCols);
 	}
 
-	@Override
-	public int getColumnCount() {
-		return 2;
-	}
-
 	@Override
 	public int getRowCount() {
 		return columns == null ? 0 : columns.getColumnCount();
 	}
 
 	@Override
-	public Object getValueAt(int row, int col) {
+	public Boolean isEnabled(int row) {
 		FlexiColumnModel cd = getObject(row);
-		switch (col) {
-			case 0: // on/off indicator; true if column is visible
-				return (enabledCols.contains(new Integer(cd.getColumnIndex())) ? Boolean.TRUE : Boolean.FALSE);
-			case 1: // name of column
-				if(cd.getHeaderLabel() != null) {
-					return cd.getHeaderLabel();
-				}
-				return translator.translate(cd.getHeaderKey());
-			default:
-				return "ERROR";
-		}
+		return cd.isAlwaysVisible() || enabledCols.contains(new Integer(cd.getColumnIndex()))
+				? Boolean.TRUE : Boolean.FALSE;
 	}
 
 	@Override
-	public FlexiColumnModel getObject(int row) {
-		if(columns == null) return null;
-		return columns.getColumnModel(row);
+	public String getLabel(int row) {
+		FlexiColumnModel cd = getObject(row);
+		return cd.getHeaderLabel() == null ?
+				translator.translate(cd.getHeaderKey()) : cd.getHeaderLabel();
 	}
 
 	@Override
-	public void setObjects(List<FlexiColumnModel> objects) {
-		//
+	public boolean isDisabled(int row) {
+		FlexiColumnModel cd = getObject(row);
+		return cd.isAlwaysVisible();
 	}
 
-	@Override
-	public VisibleFlexiColumnsModel createCopyWithEmptyList() {
-		return new VisibleFlexiColumnsModel(columns, enabledCols, translator);
+	public FlexiColumnModel getObject(int row) {
+		if(columns == null) return null;
+		return columns.getColumnModel(row);
 	}
 }
diff --git a/src/main/java/org/olat/core/gui/components/table/Table.java b/src/main/java/org/olat/core/gui/components/table/Table.java
index fd0217eb88223de53375c6ba2e7de20282e92455..f417833b1587ad491008b012ca8e99c94e9eb369 100644
--- a/src/main/java/org/olat/core/gui/components/table/Table.java
+++ b/src/main/java/org/olat/core/gui/components/table/Table.java
@@ -35,6 +35,7 @@ import java.util.List;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
+import org.olat.core.gui.components.choice.ChoiceModel;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.render.StringOutputPool;
@@ -704,8 +705,8 @@ public class Table extends AbstractComponent {
 	/**
 	 * @return a tabledatamodel for a choice
 	 */
-	protected TableDataModel createChoiceTableDataModel() {
-		return new ChoiceTableDataModel(this.isMultiSelect(), this.allCDs, this.columnOrder, this.getTranslator());
+	protected ChoiceModel createChoiceModel() {
+		return new ChoiceTableDataModel(isMultiSelect(), allCDs, columnOrder, getTranslator());
 	}
 
 	/**
@@ -973,7 +974,7 @@ public class Table extends AbstractComponent {
 
 }
 
-class ChoiceTableDataModel extends BaseTableDataModelWithoutFilter {
+class ChoiceTableDataModel implements ChoiceModel {
 	
 	private boolean isMultiSelect;
 	private List<ColumnDescriptor> allCDs;
@@ -986,11 +987,8 @@ class ChoiceTableDataModel extends BaseTableDataModelWithoutFilter {
 		this.columnOrder = columnOrder;
 		this.translator = translator;
 	}
-	
-	public int getColumnCount() {
-		return 2;
-	}
 
+	@Override
 	public int getRowCount() {
 		// if this is a multiselect table, we do not want the checkboxes of
 		// the multiselect to be disabled. therefore we simply exclude the entire
@@ -1002,15 +1000,24 @@ class ChoiceTableDataModel extends BaseTableDataModelWithoutFilter {
 		}
 	}
 
-	public Object getValueAt(final int row, final int col) {
-		ColumnDescriptor cd = allCDs.get(isMultiSelect? (row + 1): row);
-		switch (col) {
-			case 0: // on/off indicator; true if column is visible
-				return (columnOrder.contains(cd) ? Boolean.TRUE : Boolean.FALSE);
-			case 1: // name of columndescriptor
-				return cd.translateHeaderKey() ? translator.translate(cd.getHeaderKey()) : cd.getHeaderKey();
-			default:
-				return "ERROR";
-		}
+	@Override
+	public Boolean isEnabled(int row) {
+		ColumnDescriptor cd = getObject(row);
+		return columnOrder.contains(cd) ? Boolean.TRUE : Boolean.FALSE;
+	}
+
+	@Override
+	public String getLabel(int row) {
+		ColumnDescriptor cd = getObject(row);
+		return cd.translateHeaderKey() ? translator.translate(cd.getHeaderKey()) : cd.getHeaderKey();
+	}
+
+	@Override
+	public boolean isDisabled(int row) {
+		return false;
+	}
+	
+	public ColumnDescriptor getObject(int row) {
+		return allCDs.get(isMultiSelect? (row + 1): row);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/components/table/TableController.java b/src/main/java/org/olat/core/gui/components/table/TableController.java
index 210a5d96cef0a6bad3e1888e6f33b661b5da2e89..bef87e080e669490c627a4572245403d3827510b 100644
--- a/src/main/java/org/olat/core/gui/components/table/TableController.java
+++ b/src/main/java/org/olat/core/gui/components/table/TableController.java
@@ -266,12 +266,13 @@ public class TableController extends BasicController {
 		contentVc.contextPut(VC_VAR_HAS_TABLE_SEARCH, Boolean.FALSE);
 
 		//preference + download links
-		preferenceLink = LinkFactory.createCustomLink("prefLink", "cmd.changecols", "", Link.NONTRANSLATED, contentVc, this);
-		preferenceLink.setCustomEnabledLinkCSS("b_table_prefs");
+		preferenceLink = LinkFactory.createCustomLink("prefLink", "cmd.changecols", "", Link.BUTTON | Link.NONTRANSLATED, contentVc, this);
+		preferenceLink.setCustomEnabledLinkCSS("o_icon o_icon-lg o_icon_customize");
 		preferenceLink.setTooltip(translate("command.changecols"));
-		downloadLink = LinkFactory.createCustomLink("downloadLink", "cmd.download", "", Link.NONTRANSLATED, contentVc, this);
+		
+		downloadLink = LinkFactory.createCustomLink("downloadLink", "cmd.download", "", Link.BUTTON | Link.NONTRANSLATED, contentVc, this);
 		downloadLink.setTooltip(translate("table.export.title"));
-		downloadLink.setCustomEnabledLinkCSS("b_table_download");
+		downloadLink.setCustomEnabledLinkCSS("o_icon o_icon-lg o_icon_download");
 		
 		putInitialPanel(contentVc);
 	}
@@ -380,7 +381,7 @@ public class TableController extends BasicController {
 
 	private Choice getColumnListAndTheirVisibility() {
 		Choice choice = new Choice("colchoice", getTranslator());
-		choice.setTableDataModel(table.createChoiceTableDataModel());
+		choice.setModel(table.createChoiceModel());
 		choice.addListener(this);
 		choice.setCancelKey("cancel");
 		choice.setSubmitKey("save");
diff --git a/src/main/java/org/olat/core/gui/components/table/_content/tablelayout.html b/src/main/java/org/olat/core/gui/components/table/_content/tablelayout.html
index 38a17deed0216e64f0a2d7d9649dfe9db769dfe9..7600ca57bc3ebec5b5520dd5dd384f91354eb7ab 100644
--- a/src/main/java/org/olat/core/gui/components/table/_content/tablelayout.html
+++ b/src/main/java/org/olat/core/gui/components/table/_content/tablelayout.html
@@ -59,13 +59,14 @@
 				#end
 			</div>
 		#end
+		<div class="pull-right">
 		#if ($tableConfig.isPreferencesOffered())
 			$r.render("prefLink")
 		#end
-		
 		#if ($tableConfig.isDownloadOffered())	
 			$r.render("downloadLink")
 		#end
+		</div>
 	</div>
 	<div class="clearfix"></div>
 	$r.render("table", $tableConfig.getCssPrefix())
diff --git a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
index 92554f10acac99264bdd4592294e26c2d6958ced..5ab0271e59febe04ec18ca6673adab28e83b5b57 100644
--- a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
+++ b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
@@ -31,6 +31,7 @@ import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.PersistenceHelper;
 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.Form;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
@@ -123,7 +124,8 @@ public class ImportMemberOverviewIdentitiesController extends StepFormBasicContr
 		Translator myTrans = userManager.getPropertyHandlerTranslator(getTranslator());
 		ImportMemberOverviewDataModel userTableModel = new ImportMemberOverviewDataModel(oks, resultingPropertyHandlers,
 				isAdministrativeUser, getLocale(), tableColumnModel);
-		uifactory.addTableElement(ureq, getWindowControl(), "users", userTableModel, myTrans, formLayout);
+		FlexiTableElement tableEl = uifactory.addTableElement(ureq, getWindowControl(), "users", userTableModel, myTrans, formLayout);
+		tableEl.setCustomizeColumns(false);
 	}
 	
 	private void loadModel(List<String> keys) {
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java
index e7eea2addfbb7e824e229ff222036c803372d93d..0bb62d0c2d7e47810b8b843b4eb5fd3a3a90a38c 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListAssessmentController.java
@@ -254,6 +254,8 @@ public class CheckListAssessmentController extends FormBasicController implement
 			table.setFilters("participants", filters);
 		}
 		table.setExportEnabled(true);
+		table.setCustomizeColumns(true);
+		table.setAndLoadPersistedPreferences(ureq, "checklist-assessment");
 		
 		pdfExport = uifactory.addFormLink("pdf.export", formLayout, Link.BUTTON);
 		pdfExport.setEnabled(numOfCheckbox > 0);
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java
index fbd90d6b5a0f2abe7ab985e0c341f20d38267a68..b8816b98a82e906d05032af3c4193147c4d7620c 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java
@@ -132,6 +132,7 @@ public class CheckListBoxListEditController extends FormBasicController {
 		}
 		model = new CheckboxConfigDataModel(boxList, getTranslator(), columnsModel);
 		boxTable = uifactory.addTableElement(ureq, getWindowControl(), "checkbox-list", model, getTranslator(), tableCont);
+		boxTable.setCustomizeColumns(false);
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java
index 61db889358a9bdbfcd0b65cbb99a76e61577e7b9..973ff0a3a989567e81831f77da5da99a451307fb 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxAssessmentController.java
@@ -221,7 +221,9 @@ public class CheckboxAssessmentController extends FormBasicController {
 
 		model = new CheckboxAssessmentDataModel(boxRows, columnsModel);
 		table = uifactory.addTableElement(ureq, getWindowControl(), "checkbox-list", model, getTranslator(), formLayout);
+		table.setCustomizeColumns(true);
 		table.setEditMode(true);
+		table.setAndLoadPersistedPreferences(ureq, "checkbox-assessment");
 
 		FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		formLayout.add(buttonsCont);
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckboxListStepController.java b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckboxListStepController.java
index eb0eac849032e3e5412234cd4983a2ff1cd8af94..23d4bcef919552393454a0ac99c14b84bfc6716b 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckboxListStepController.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckboxListStepController.java
@@ -102,6 +102,7 @@ public class CheckboxListStepController extends StepFormBasicController {
 		List<Checkbox> boxList = data.getCheckboxList();
 		model = new CheckboxConfigDataModel(boxList, getTranslator(), columnsModel);
 		boxTable = uifactory.addTableElement(ureq, getWindowControl(), "checkbox-list", model, getTranslator(), tableCont);
+		boxTable.setCustomizeColumns(false);
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java b/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java
index f1101d908e22b78472ae18d97c7d4d84f4e62fc9..c3ec3455d12dfea8a90400111b40349851a82942 100644
--- a/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java
+++ b/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java
@@ -144,6 +144,7 @@ public class CourseSiteAdminController extends FormBasicController {
 		tableEl = uifactory.addTableElement(ureq, getWindowControl(), "languageTable", model, getTranslator(), tableLayout);
 		tableEl.setRendererType(FlexiTableRendererType.classic);
 		tableEl.setCustomizeColumns(true);
+		tableEl.setAndLoadPersistedPreferences(ureq, "course-site-admin");
 
 		FormLayoutContainer buttonsLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		formLayout.add(buttonsLayout);
diff --git a/src/main/java/org/olat/group/ui/area/BGAreaEditController.java b/src/main/java/org/olat/group/ui/area/BGAreaEditController.java
index 670717566774ea6f6ec6f7461c9080e4214e622e..fb7018d1fc30a047684e0d11fad6887d9c25d460 100644
--- a/src/main/java/org/olat/group/ui/area/BGAreaEditController.java
+++ b/src/main/java/org/olat/group/ui/area/BGAreaEditController.java
@@ -140,7 +140,7 @@ public class BGAreaEditController extends BasicController {
 		groupsChoice = new Choice("groupsChoice", getTranslator());
 		groupsChoice.setSubmitKey("submit");
 		groupsChoice.setCancelKey("cancel");
-		groupsChoice.setTableDataModel(groupsDataModel);
+		groupsChoice.setModel(groupsDataModel);
 		groupsChoice.addListener(this);
 		groupsTabVC.put("groupsChoice", groupsChoice);
 		groupsTabVC.contextPut("noGroupsFound", (allGroups.size() > 0 ? Boolean.FALSE : Boolean.TRUE));
diff --git a/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java b/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java
index e1c22100c0735f7fb8c447112d50af294fc9e892..6f645f61028cf03ad0319b1d62e0395394b8d73d 100644
--- a/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java
+++ b/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java
@@ -25,10 +25,9 @@
 
 package org.olat.group.ui.area;
 
-import java.util.ArrayList;
 import java.util.List;
 
-import org.olat.core.gui.components.table.DefaultTableDataModel;
+import org.olat.core.gui.components.choice.ChoiceModel;
 import org.olat.group.BusinessGroup;
 
 /**
@@ -37,7 +36,8 @@ import org.olat.group.BusinessGroup;
  * 
  * @author gnaegi
  */
-public class GroupsToAreaDataModel extends DefaultTableDataModel<BusinessGroup> {
+public class GroupsToAreaDataModel implements ChoiceModel {
+	private final List<BusinessGroup> allGroups;
 	private final List<BusinessGroup> inAreaGroups;
 
 	/**
@@ -48,32 +48,31 @@ public class GroupsToAreaDataModel extends DefaultTableDataModel<BusinessGroup>
 	 *          checked rows.
 	 */
 	public GroupsToAreaDataModel(List<BusinessGroup> allGroups, List<BusinessGroup> inAreaGroups) {
-		super(allGroups);
+		this.allGroups = allGroups;
 		this.inAreaGroups = inAreaGroups;
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.table.TableDataModel#getColumnCount()
-	 */
-	public int getColumnCount() {
-		return 2;
+	@Override
+	public int getRowCount() {
+		return allGroups == null ? 0 : allGroups.size();
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.table.TableDataModel#getValueAt(int, int)
-	 */
-	public Object getValueAt(int row, int col) {
-		if (col == 0) {
-			return inAreaGroups.contains(getObject(row)) ? Boolean.TRUE : Boolean.FALSE;
-		} else if (col == 1) {
-			return getObject(row).getName();
-		} else {
-			return "ERROR";
-		}
+	@Override
+	public Boolean isEnabled(int row) {
+		return inAreaGroups.contains(getObject(row)) ? Boolean.TRUE : Boolean.FALSE;
 	}
 
 	@Override
-	public GroupsToAreaDataModel createCopyWithEmptyList() {
-		return new GroupsToAreaDataModel(new ArrayList<BusinessGroup>(), inAreaGroups);
+	public String getLabel(int row) {
+		return getObject(row).getName();
+	}
+
+	@Override
+	public boolean isDisabled(int row) {
+		return false;
+	}
+	
+	public BusinessGroup getObject(int row) {
+		return allGroups.get(row);
 	}
 }
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 a2092bdb0dfef7a27eff76272d0e32fad57b2f5d..f1ebeb031abc1674b329d2ce95e8485207dfef27 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
@@ -114,6 +114,7 @@ public class PoolsAdminController extends FormBasicController {
 
 		model = new PoolDataModel(columnsModel, getTranslator());
 		poolTable = uifactory.addTableElement(ureq, getWindowControl(), "pools", model, getTranslator(), formLayout);
+		poolTable.setCustomizeColumns(false);
 		
 		poolTable.setRendererType(FlexiTableRendererType.classic);
 		reloadModel();
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java
index f26b91d7c5f32857284a44becf26bceaef8c35e5..9a300e4e4597d9c3d7b3b85ec395bf1ede33715d 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/QEducationalContextsAdminController.java
@@ -107,6 +107,7 @@ public class QEducationalContextsAdminController extends FormBasicController {
 		model = new LevelDataModel(columnsModel);
 		tableEl = uifactory.addTableElement(ureq, getWindowControl(), "levels", model, getTranslator(), formLayout);
 		tableEl.setRendererType(FlexiTableRendererType.classic);
+		tableEl.setCustomizeColumns(false);
 		
 		createType = uifactory.addFormLink("create.level", formLayout, Link.BUTTON);
 	}
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java
index 02b5353804c27f2155c664de8566eb3338864d52..a5de1edbc804d4f366e406f8d324a3be560fa1ae 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/QItemTypesAdminController.java
@@ -107,6 +107,7 @@ public class QItemTypesAdminController extends FormBasicController {
 		model = new QItemTypeDataModel(columnsModel);
 		tableEl = uifactory.addTableElement(ureq, getWindowControl(), "types", model, getTranslator(), formLayout);
 		tableEl.setRendererType(FlexiTableRendererType.classic);
+		tableEl.setCustomizeColumns(false);
 		
 		createType = uifactory.addFormLink("create.type", formLayout, Link.BUTTON);
 	}
diff --git a/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java b/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java
index 4af38b97b873035cb9e95fecc76affbb9238fef7..a14e3e54bd1a823a7a2d720af35c5d2e721a18d5 100644
--- a/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java
+++ b/src/main/java/org/olat/modules/qpool/ui/admin/QLicensesAdminController.java
@@ -99,6 +99,7 @@ public class QLicensesAdminController extends FormBasicController {
 		model = new QItemTypeDataModel(columnsModel);
 		tableEl = uifactory.addTableElement(ureq, getWindowControl(), "licenses", model, getTranslator(), formLayout);
 		tableEl.setRendererType(FlexiTableRendererType.classic);
+		tableEl.setCustomizeColumns(false);
 		
 		createType = uifactory.addFormLink("create.license", formLayout, Link.BUTTON);
 	}
diff --git a/src/main/java/org/olat/repository/ui/LifecycleAdminController.java b/src/main/java/org/olat/repository/ui/LifecycleAdminController.java
index a1a7610f7a435ac03374772dc7273c3bdfff012f..48ae1660a54209e4be3393ce147483cdee981e93 100644
--- a/src/main/java/org/olat/repository/ui/LifecycleAdminController.java
+++ b/src/main/java/org/olat/repository/ui/LifecycleAdminController.java
@@ -95,6 +95,7 @@ public class LifecycleAdminController extends FormBasicController {
 		model = new LifecycleDataModel(columnsModel);
 		tableEl = uifactory.addTableElement(ureq, getWindowControl(), "cycles", model, getTranslator(), formLayout);
 		tableEl.setRendererType(FlexiTableRendererType.classic);
+		tableEl.setCustomizeColumns(false);
 		
 		createLifeCycle = uifactory.addFormLink("create.lifecycle", formLayout, Link.BUTTON);
 	}
diff --git a/src/main/java/org/olat/repository/ui/author/AuthorListController.java b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
index 29fff07da8842c5667df9ebc0425c3f8116fd18c..0a9ee7edc569132e98d5c836a64873c24855cfd8 100644
--- a/src/main/java/org/olat/repository/ui/author/AuthorListController.java
+++ b/src/main/java/org/olat/repository/ui/author/AuthorListController.java
@@ -96,6 +96,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class AuthorListController extends FormBasicController implements Activateable2, AuthoringEntryDataSourceUIFactory {
 
+	private final String i18nName;
 	private FlexiTableElement tableEl;
 	private final TooledStackedPanel stackPanel;
 	
@@ -129,6 +130,7 @@ public class AuthorListController extends FormBasicController implements Activat
 		super(ureq, wControl, "entries");
 		setTranslator(Util.createPackageTranslator(RepositoryManager.class, getLocale(), getTranslator()));
 
+		this.i18nName = i18nName;
 		this.searchParams = searchParams;
 		this.startExtendedSearch = startExtendedSearch;
 		
@@ -221,6 +223,7 @@ public class AuthorListController extends FormBasicController implements Activat
 		tableEl.setElementCssClass("o_coursetable");
 		tableEl.setMultiSelect(true);
 		tableEl.setSortSettings(new FlexiTableSortOptions(true));
+		tableEl.setAndLoadPersistedPreferences(ureq, "authors-list-" + i18nName);
 		
 		if(startExtendedSearch) {
 			tableEl.expandExtendedSearch(ureq);
diff --git a/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java b/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java
index 953731cf5fe2ba915317ad3bbe81f12e7553671c..37e3a5e0a87d615b59242d4c3fe2ab0c1c290297 100644
--- a/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java
+++ b/src/main/java/org/olat/repository/ui/list/CatalogNodeController.java
@@ -122,7 +122,7 @@ public class CatalogNodeController extends BasicController implements Activateab
 		SearchMyRepositoryEntryViewParams searchParams
 			= new SearchMyRepositoryEntryViewParams(getIdentity(), ureq.getUserSession().getRoles(), "CourseModule");
 		searchParams.setParentEntry(catalogEntry);
-		entryListController = new RepositoryEntryListController(ureq, wControl, searchParams, stackPanel);
+		entryListController = new RepositoryEntryListController(ureq, wControl, searchParams, "catalog", stackPanel);
 		mainVC.put("entries", entryListController.getInitialComponent());
 		listenTo(entryListController);
 
diff --git a/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java b/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
index 1267b2b3bd95acbd3afdd42b3f242b59874f0b5d..b371d9ffd18f165074a9804e3bbc6583b10330b9 100644
--- a/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
+++ b/src/main/java/org/olat/repository/ui/list/OverviewRepositoryListController.java
@@ -169,7 +169,7 @@ public class OverviewRepositoryListController extends BasicController implements
 			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
 			markedStackPanel = new BreadcrumbedStackedPanel("mrkstack", getTranslator(), this);
-			markedCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, markedStackPanel);
+			markedCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, "marked", markedStackPanel);
 			markedStackPanel.pushController(translate("search.mark"), markedCtrl);
 			listenTo(markedCtrl);
 		}
@@ -189,7 +189,7 @@ public class OverviewRepositoryListController extends BasicController implements
 			ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 			WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
 			myCoursesStackPanel = new BreadcrumbedStackedPanel("mystack", getTranslator(), this);
-			myCoursesCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, myCoursesStackPanel);
+			myCoursesCtrl = new RepositoryEntryListController(ureq, bwControl, searchParams, "my", myCoursesStackPanel);
 			myCoursesStackPanel.pushController(translate("search.mycourses.student"), myCoursesCtrl);
 			listenTo(myCoursesCtrl);
 		}
diff --git a/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java b/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java
index 5629d03727bfa7d812a58b06b02cef922b34f277..3f385784eaebf2e0f58866df8835121a6fe0548d 100644
--- a/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java
+++ b/src/main/java/org/olat/repository/ui/list/RepositoryEntryListController.java
@@ -82,6 +82,7 @@ public class RepositoryEntryListController extends FormBasicController
 	private final List<Link> filters = new ArrayList<>();
 	private final List<Link> orderBy = new ArrayList<>();
 
+	private final String name;
 	private FlexiTableElement tableEl;
 	private RepositoryEntryDataModel model;
 	private DefaultRepositoryEntryDataSource dataSource;
@@ -97,11 +98,11 @@ public class RepositoryEntryListController extends FormBasicController
 	private UserRatingsDAO userRatingsDao;
 	
 	public RepositoryEntryListController(UserRequest ureq, WindowControl wControl,
-			SearchMyRepositoryEntryViewParams searchParams, BreadcrumbPanel stackPanel) {
+			SearchMyRepositoryEntryViewParams searchParams, String name, BreadcrumbPanel stackPanel) {
 		super(ureq, wControl, "repoentry_table");
 		setTranslator(Util.createPackageTranslator(RepositoryManager.class, getLocale(), getTranslator()));
 		mapperThumbnailUrl = registerCacheableMapper(ureq, "repositoryentryImage", new RepositoryEntryImageMapper());
-		
+		this.name = name;
 		this.stackPanel = stackPanel;
 		
 		dataSource = new DefaultRepositoryEntryDataSource(searchParams, this);
@@ -178,6 +179,7 @@ public class RepositoryEntryListController extends FormBasicController
 		VelocityContainer row = createVelocityContainer("row_1");
 		row.setDomReplacementWrapperRequired(false); // sets its own DOM id in velocity container
 		tableEl.setRowRenderer(row, this);
+		tableEl.setAndLoadPersistedPreferences(ureq, "re-list-" + name);
 	}
 
 	@Override