From b00d0c4ebee53d46dd00fb25452d4929a8ae6393 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 10 Feb 2014 08:16:30 +0100
Subject: [PATCH] OO-763: don't use the container as reference for collection
 of components but an interface instead, break the inheritence of Panel and
 flatted it

---
 .../InfoMessageControllerSingleVM.java        |   8 +-
 .../olat/admin/user/UserSearchController.java |   6 +-
 .../user/UsermanagerUserSearchController.java |   4 +-
 .../ui/KalendarEntryDetailsController.java    |   4 +-
 .../FileChooseCreateEditController.java       |   4 +-
 .../filechooser/FileChooserController.java    |   4 +-
 .../simple/SimpleBaseController.java          |   5 +-
 .../linkchooser/LinkChooserController.java    |   4 +-
 .../navigation/YearNavigationController.java  |   4 +-
 .../fullWebApp/BaseFullWebappController.java  |   7 +-
 .../modules/bc/commands/CmdCreateFile.java    |   4 +-
 .../iframe/IframePortletRunController.java    |   4 +-
 .../gui/components/AbstractComponent.java     |   7 +-
 .../olat/core/gui/components/Component.java   |   4 +-
 .../gui/components/ComponentCollection.java   |   6 +-
 .../core/gui/components/ComponentHelper.java  |   2 +-
 .../org/olat/core/gui/components/Window.java  |  12 +-
 .../components/date/DateComponentFactory.java |   6 +-
 .../components/form/flexible/impl/Form.java   |  16 +-
 .../flexible/impl/FormBasicController.java    |   4 +-
 .../flexible/impl/FormWrapperContainer.java   |  35 +++-
 .../impl/FormWrapperContainerRenderer.java    |   8 +-
 .../elements/table/FlexiTableComponent.java   |   7 +
 .../gui/components/panel/LayeredPanel.java    |   2 +-
 .../core/gui/components/panel/MainPanel.java  |   2 +-
 .../core/gui/components/panel/OncePanel.java  |  66 +++++++-
 .../olat/core/gui/components/panel/Panel.java | 135 ++++++---------
 .../gui/components/panel/PanelRenderer.java   |  91 ++++------
 .../gui/components/panel/StackedPanel.java    | 156 ++++++++++++++++++
 .../gui/components/tabbedpane/TabbedPane.java |   2 +-
 .../tabbedpane/TabbedPaneChangedEvent.java    |   2 +
 .../gui/components/util/ComponentUtil.java    |   3 +-
 .../velocity/VelocityContainer.java           |   2 +-
 .../core/gui/control/DefaultController.java   |  10 +-
 .../control/controller/BasicController.java   |  10 +-
 .../generic/docking/DockController.java       |   4 +-
 .../core/gui/control/guistack/GuiStack.java   |   6 +-
 .../control/guistack/GuiStackNiceImpl.java    |  11 +-
 .../control/guistack/GuiStackSimpleImpl.java  |  10 +-
 .../dev/controller/DevelopmentController.java |   5 +-
 .../org/olat/core/gui/render/Renderer.java    |  10 +-
 .../debug/GuiDebugDispatcherController.java   |   4 +-
 ...TranslationInterceptHandlerController.java |   4 +-
 .../DisposedCourseRestartController.java      |   4 +-
 .../archiver/CourseLogsArchiveController.java |   3 +-
 .../ScoreAccountingArchiveController.java     |   4 +-
 .../course/area/CourseAreasController.java    |   4 +-
 .../nodes/basiclti/LTIRunController.java      |   6 +-
 .../olat/course/nodes/iq/IQRunController.java |   3 +-
 .../ProjectDetailsPanelController.java        |   6 +-
 .../projectbroker/ProjectListController.java  |  10 +-
 .../DisposedCourseSiteRestartController.java  |   4 +-
 .../gui/demo/guidemo/GuiDemoController.java   |  11 +-
 .../demo/guidemo/GuiDemoDialogController.java |  12 +-
 .../GuiDemoFlexiFormMainController.java       |   7 +-
 .../demo/guidemo/GuiDemoLinksController.java  |   6 +-
 .../login/LoginAuthprovidersController.java   |   6 +-
 .../dialog/DialogElementsController.java      |   4 +-
 .../modules/fo/FilterForUserController.java   |   4 +-
 .../org/olat/modules/fo/ForumController.java  |   6 +-
 .../olat/modules/wiki/WikiMainController.java |   3 +-
 .../ui/structel/EPMultipleMapController.java  |   4 +-
 .../ui/OrdersAdminController.java             |   4 +-
 .../accesscontrol/ui/OrdersController.java    |   4 +-
 64 files changed, 494 insertions(+), 321 deletions(-)
 create mode 100644 src/main/java/org/olat/core/gui/components/panel/StackedPanel.java

diff --git a/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java b/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java
index 62991eb0637..9c49276297f 100644
--- a/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java
+++ b/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java
@@ -31,7 +31,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -53,7 +53,7 @@ public class InfoMessageControllerSingleVM extends BasicController {
 	private Link infomsgEditButton,infomsgClearButton, maintenancemsgEditButton,maintenancemsgClearButton;
 	private VelocityContainer infoMsgView, infoMsgEdit;
 	private InfoMsgForm infoMsgForm, maintenanceMsgForm;
-	private Panel container;
+	private StackedPanel container;
 	
 	/**
 	 * 
@@ -62,7 +62,7 @@ public class InfoMessageControllerSingleVM extends BasicController {
 	 */
 	public InfoMessageControllerSingleVM(UserRequest ureq, WindowControl control) {
 		super(ureq, control);
-		container = new Panel("container");
+		container = new StackedPanel("container");
 		infoMsgView = createVelocityContainer("infomsg");
 		infoMsgEdit = createVelocityContainer("infomsgEdit");
 		infoMsgView.contextPut("cluster", Boolean.FALSE);
@@ -170,7 +170,7 @@ public class InfoMessageControllerSingleVM extends BasicController {
 	protected VelocityContainer getEditContainer() {
 		return infoMsgEdit;
 	}
-	protected Panel getMainContainer() {
+	protected StackedPanel getMainContainer() {
 		return container;
 	}
 	protected InfoMsgForm getMaintenanceMsgForm() {
diff --git a/src/main/java/org/olat/admin/user/UserSearchController.java b/src/main/java/org/olat/admin/user/UserSearchController.java
index 4bf21a0ce67..212a193d826 100644
--- a/src/main/java/org/olat/admin/user/UserSearchController.java
+++ b/src/main/java/org/olat/admin/user/UserSearchController.java
@@ -36,7 +36,7 @@ import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.table.StaticColumnDescriptor;
 import org.olat.core.gui.components.table.Table;
 import org.olat.core.gui.components.table.TableController;
@@ -100,7 +100,7 @@ public class UserSearchController extends BasicController {
 	private static final String ACTION_MULTISELECT_CHOOSE = "msc";
 	
 	private VelocityContainer myContent;
-	private Panel searchPanel;
+	private StackedPanel searchPanel;
 	private UserSearchForm searchform;
 	private TableController tableCtr;
 	private TableGuiConfiguration tableConfig;
@@ -170,7 +170,7 @@ public class UserSearchController extends BasicController {
 		myContent = new VelocityContainer("olatusersearch", VELOCITY_ROOT + "/usersearch.html", pT, this);
 		backLink = LinkFactory.createButton("btn.back", myContent, this);
 		
-		searchPanel = new Panel("usersearchPanel");
+		searchPanel = new StackedPanel("usersearchPanel");
 		searchPanel.addListener(this);
 		myContent.put("usersearchPanel", searchPanel);
 
diff --git a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
index 43fa5920ced..e8d2acc1c9a 100644
--- a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
+++ b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
@@ -61,7 +61,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.table.Table;
 import org.olat.core.gui.components.table.TableController;
 import org.olat.core.gui.components.table.TableEvent;
@@ -119,7 +119,7 @@ public class UsermanagerUserSearchController extends BasicController implements
 	private static final String CMD_BULKEDIT = "bulkEditUsers";
 
 	private VelocityContainer userListVC, userSearchVC, mailVC;
-	private Panel panel;
+	private StackedPanel panel;
 
 	private UsermanagerUserSearchForm searchform;
 	private TableController tableCtr;
diff --git a/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java b/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java
index 5e232661499..38f3d644ee3 100644
--- a/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java
+++ b/src/main/java/org/olat/commons/calendar/ui/KalendarEntryDetailsController.java
@@ -42,7 +42,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.tabbedpane.TabbedPane;
 import org.olat.core.gui.components.tabbedpane.TabbedPaneChangedEvent;
 import org.olat.core.gui.components.velocity.VelocityContainer;
@@ -62,7 +62,7 @@ public class KalendarEntryDetailsController extends BasicController {
 	private Collection<KalendarRenderWrapper> availableCalendars;
 	private boolean isNew, isReadOnly;
 	private KalendarEvent kalendarEvent;
-	private Panel mainPanel;
+	private StackedPanel mainPanel;
 	private VelocityContainer mainVC, eventVC, linkVC;
 	private TabbedPane pane;
 	private KalendarEntryForm eventForm;
diff --git a/src/main/java/org/olat/commons/file/filechooser/FileChooseCreateEditController.java b/src/main/java/org/olat/commons/file/filechooser/FileChooseCreateEditController.java
index df4084c7b7c..6883795cb78 100644
--- a/src/main/java/org/olat/commons/file/filechooser/FileChooseCreateEditController.java
+++ b/src/main/java/org/olat/commons/file/filechooser/FileChooseCreateEditController.java
@@ -52,7 +52,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -224,7 +224,7 @@ public class FileChooseCreateEditController extends BasicController{
 		cmdUpload.execute(folderComponent, ureq, getTranslator(), true);		
 		cmdUpload.hideFieldset();
 		listenTo(cmdUpload);
-		Panel mainPanel = new Panel("upl");
+		StackedPanel mainPanel = new StackedPanel("upl");
 		Component uploadComp = cmdUpload.getInitialComponent();
 		if (uploadComp != null)	{
 			mainPanel.pushContent(uploadComp);
diff --git a/src/main/java/org/olat/commons/file/filechooser/FileChooserController.java b/src/main/java/org/olat/commons/file/filechooser/FileChooserController.java
index e2cb0734ef8..7c766c41859 100644
--- a/src/main/java/org/olat/commons/file/filechooser/FileChooserController.java
+++ b/src/main/java/org/olat/commons/file/filechooser/FileChooserController.java
@@ -38,7 +38,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -100,7 +100,7 @@ public class FileChooserController extends BasicController {
 	private Link cancelButton;
 	
 	private FileUploadController fileUploadCtr;
-	private Panel panel;
+	private StackedPanel panel;
 	private File uploadDir;
 	private VFSContainer uploadContainer;
 
diff --git a/src/main/java/org/olat/core/commons/chiefcontrollers/controller/simple/SimpleBaseController.java b/src/main/java/org/olat/core/commons/chiefcontrollers/controller/simple/SimpleBaseController.java
index 1b7cf726e57..af85f350732 100644
--- a/src/main/java/org/olat/core/commons/chiefcontrollers/controller/simple/SimpleBaseController.java
+++ b/src/main/java/org/olat/core/commons/chiefcontrollers/controller/simple/SimpleBaseController.java
@@ -30,6 +30,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.panel.OncePanel;
 import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.ContentableController;
 import org.olat.core.gui.control.Controller;
@@ -189,12 +190,12 @@ public class SimpleBaseController extends BasicController implements Contentable
 
 	private void setGuiStack(GuiStack guiStack) {
 		currentGuiStack = guiStack;
-		Panel guiStackPanel = currentGuiStack.getPanel();
+		StackedPanel guiStackPanel = currentGuiStack.getPanel();
 		content.setContent(guiStackPanel);
 		// place for modal dialogs, which are overlayd over the normal layout (using
 		// css alpha blending)
 		// maybe null if no current modal dialog -> clears the panel
-		Panel modalStackP = currentGuiStack.getModalPanel();
+		StackedPanel modalStackP = currentGuiStack.getModalPanel();
 		modalPanel.setContent(modalStackP);
 	}
 
diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java
index eee6d477ae6..60392fd3283 100644
--- a/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java
+++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/LinkChooserController.java
@@ -29,7 +29,7 @@ package org.olat.core.commons.controllers.linkchooser;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.tabbedpane.TabbedPane;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
@@ -48,7 +48,7 @@ import org.olat.core.util.vfs.VFSContainer;
 public class LinkChooserController extends BasicController {
 
 	private VelocityContainer tabbedPaneViewVC, closeVC;
-	private Panel mainPanel;
+	private StackedPanel mainPanel;
 
 	private TabbedPane linkChooserTabbedPane;
 	private FileLinkChooserController fileLinkChooserController;
diff --git a/src/main/java/org/olat/core/commons/controllers/navigation/YearNavigationController.java b/src/main/java/org/olat/core/commons/controllers/navigation/YearNavigationController.java
index 01a248a8204..34623e80938 100644
--- a/src/main/java/org/olat/core/commons/controllers/navigation/YearNavigationController.java
+++ b/src/main/java/org/olat/core/commons/controllers/navigation/YearNavigationController.java
@@ -26,7 +26,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -55,7 +55,7 @@ public class YearNavigationController extends BasicController {
 	private YearNavigationModel model;
 	private Link next, previous, yearLink;
 	private VelocityContainer mainVC;
-	private Panel mainPanel;
+	private StackedPanel mainPanel;
 	private List<Link> monthLinks;
 	private List<? extends Dated> allObjects;
 	private boolean showAll = true;
diff --git a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
index 9056af30d34..a31dee98ac2 100644
--- a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
+++ b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappController.java
@@ -50,6 +50,7 @@ import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
 import org.olat.core.gui.components.panel.OncePanel;
 import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.text.TextFactory;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
@@ -133,7 +134,7 @@ public class BaseFullWebappController extends BasicController implements Generic
 	//
 	private BaseFullWebappControllerParts baseFullWebappControllerParts;
 	protected Controller contentCtrl;
-	private Panel initialPanel;
+	private StackedPanel initialPanel;
 	private DTabs myDTabsImpl;
 	private static Integer MAX_TAB;
 	private WindowSettings wSettings;
@@ -523,12 +524,12 @@ public class BaseFullWebappController extends BasicController implements Generic
 
 	private void setGuiStack(GuiStack guiStack) {
 		currentGuiStack = guiStack;
-		Panel guiStackPanel = currentGuiStack.getPanel();
+		StackedPanel guiStackPanel = currentGuiStack.getPanel();
 		main.setContent(guiStackPanel);
 		// place for modal dialogs, which are overlayd over the normal layout (using
 		// css alpha blending)
 		// maybe null if no current modal dialog -> clears the panel
-		Panel modalStackP = currentGuiStack.getModalPanel();
+		StackedPanel modalStackP = currentGuiStack.getModalPanel();
 		modalPanel.setContent(modalStackP);
 	}
 
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
index d3f3712838f..54cc04d6bc2 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
@@ -38,7 +38,7 @@ import org.olat.core.commons.modules.bc.meta.MetaInfo;
 import org.olat.core.commons.modules.bc.meta.MetaInfoFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -70,7 +70,7 @@ public class CmdCreateFile extends BasicController implements FolderCommand {
 	private int status = FolderCommandStatus.STATUS_SUCCESS;
 	private FolderComponent folderComponent;
 	private VelocityContainer mainVC;
-	private Panel mainPanel;
+	private StackedPanel mainPanel;
 	
 	private CreateFileForm createFileForm;
 	private Controller editorCtr;
diff --git a/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java b/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java
index abdf97f90ff..d95cae99425 100644
--- a/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java
+++ b/src/main/java/org/olat/core/commons/portlets/iframe/IframePortletRunController.java
@@ -35,7 +35,6 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -60,7 +59,6 @@ public class IframePortletRunController extends BasicController {
 	
 	private OLog log = Tracing.createLoggerFor(this.getClass());
 	
-	private Panel panel;
 	private VelocityContainer iframeVC;
 	private Link editLink;
 	private Controller editorCtr;
@@ -111,7 +109,7 @@ public class IframePortletRunController extends BasicController {
 			editLink.setEnabled(editLinkEnabled);//edit link always there, but disabled if something went wrong
 		}		
 		
-		panel = this.putInitialPanel(this.iframeVC);
+		putInitialPanel(iframeVC);
 	}
 	
 	/**
diff --git a/src/main/java/org/olat/core/gui/components/AbstractComponent.java b/src/main/java/org/olat/core/gui/components/AbstractComponent.java
index 7084de639e9..60aafcd95e4 100644
--- a/src/main/java/org/olat/core/gui/components/AbstractComponent.java
+++ b/src/main/java/org/olat/core/gui/components/AbstractComponent.java
@@ -78,8 +78,7 @@ public abstract class AbstractComponent implements Component {
 	 * do not create a logger for this class otherwise millions of useless loggers are created which consumes
 	 * quite some memory
 	 */
-
-	private Container parent = null;
+	private ComponentCollection parent;
 	/**
 	 * 
 	 * @param name the name of this component
@@ -415,14 +414,14 @@ public abstract class AbstractComponent implements Component {
 	 * to be called only by the container when a child is added
 	 * @param parent
 	 */
-	public void setParent(Container parent){
+	public void setParent(ComponentCollection parent){
 		this.parent = parent;
 	}
 	
 	/**
 	 * @return
 	 */
-	public Container getParent(){
+	public ComponentCollection getParent(){
 		return parent;
 	}
 	
diff --git a/src/main/java/org/olat/core/gui/components/Component.java b/src/main/java/org/olat/core/gui/components/Component.java
index c0331d91203..b96f114a43e 100644
--- a/src/main/java/org/olat/core/gui/components/Component.java
+++ b/src/main/java/org/olat/core/gui/components/Component.java
@@ -72,9 +72,9 @@ public interface Component {
 	
 	public boolean isSilentlyDynamicalCmp();
 	
-	public Container getParent();
+	public ComponentCollection getParent();
 	
-	public void setParent(Container parent);
+	public void setParent(ComponentCollection parent);
 	
 	public void addListener(ComponentEventListener controller);
 	
diff --git a/src/main/java/org/olat/core/gui/components/ComponentCollection.java b/src/main/java/org/olat/core/gui/components/ComponentCollection.java
index 6c611a3163e..a181df9d3b0 100644
--- a/src/main/java/org/olat/core/gui/components/ComponentCollection.java
+++ b/src/main/java/org/olat/core/gui/components/ComponentCollection.java
@@ -19,16 +19,20 @@
  */
 package org.olat.core.gui.components;
 
+import java.util.Map;
+
 /**
  * 
  * Initial date: 06.02.2013<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-public interface ComponentCollection {
+public interface ComponentCollection extends Component {
 	
 	public Component getComponent(String name);
 	
 	public Iterable<Component> getComponents();
+	
+	public Map<String, Component> getComponentMap();
 
 }
diff --git a/src/main/java/org/olat/core/gui/components/ComponentHelper.java b/src/main/java/org/olat/core/gui/components/ComponentHelper.java
index 83fd0b2ee6d..ae274e741df 100644
--- a/src/main/java/org/olat/core/gui/components/ComponentHelper.java
+++ b/src/main/java/org/olat/core/gui/components/ComponentHelper.java
@@ -98,7 +98,7 @@ public class ComponentHelper {
 	 * @param top
 	 * @param vr
 	 */
-	public static void validateComponentTree(UserRequest ureq, Container top, ValidationResult vr) {
+	public static void validateComponentTree(UserRequest ureq, ComponentCollection top, ValidationResult vr) {
 		doValidate(ureq, top, vr);
 	}
 
diff --git a/src/main/java/org/olat/core/gui/components/Window.java b/src/main/java/org/olat/core/gui/components/Window.java
index e0da11f3c4e..728af05dfc0 100644
--- a/src/main/java/org/olat/core/gui/components/Window.java
+++ b/src/main/java/org/olat/core/gui/components/Window.java
@@ -93,7 +93,7 @@ import org.olat.testutils.codepoints.server.Codepoint;
  * 
  * @author Felix Jost
  */
-public class Window extends Container {
+public class Window extends AbstractComponent {
 	
 	private static final OLog log = Tracing.createLoggerFor(Window.class);
 	
@@ -138,7 +138,7 @@ public class Window extends Container {
 	public static final Event ABOUT_TO_DISPATCH = new Event("about_to_dispatch");
 	
 	private String uriPrefix;
-	private Container contentPane;
+	private ComponentCollection contentPane;
 	private String latestTimestamp;
 	private AsyncMediaResponsible asyncMediaResponsible;
 	private String instanceId;
@@ -201,7 +201,7 @@ public class Window extends Container {
 	/**
 	 * @return Container
 	 */
-	public Container getContentPane() {
+	public ComponentCollection getContentPane() {
 		return contentPane;
 	}
 
@@ -210,7 +210,7 @@ public class Window extends Container {
 	 * 
 	 * @param contentPane The contentPane to set
 	 */
-	public void setContentPane(Container contentPane) {
+	public void setContentPane(ComponentCollection contentPane) {
 		this.contentPane = contentPane;
 	}
 
@@ -373,7 +373,7 @@ public class Window extends Container {
 									fireEvent(ureq, OLDTIMESTAMPCALL);
 								}
 								
-								Container top = getContentPane();
+								ComponentCollection top = getContentPane();
 								// always validate here, since we are never in the case of just rerendering (we are in the bg iframe)
 								ValidatingVisitor vv = new ValidatingVisitor(gsettings, jsAndCssAdder);
 								ComponentTraverser ct = new ComponentTraverser(vv, top, false);
@@ -665,7 +665,7 @@ public class Window extends Container {
 			if (inline) {
 					// do inline rendering.
 					
-					Container top = getContentPane();
+					ComponentCollection top = getContentPane();
 					// validate prior to rendering, but only if the timestamp was not null
 					// /
 					// the component just got dispatched
diff --git a/src/main/java/org/olat/core/gui/components/date/DateComponentFactory.java b/src/main/java/org/olat/core/gui/components/date/DateComponentFactory.java
index ce86f072330..bc71eb0a818 100644
--- a/src/main/java/org/olat/core/gui/components/date/DateComponentFactory.java
+++ b/src/main/java/org/olat/core/gui/components/date/DateComponentFactory.java
@@ -21,7 +21,7 @@ package org.olat.core.gui.components.date;
 
 import java.util.Date;
 
-import org.olat.core.gui.components.Container;
+import org.olat.core.gui.components.velocity.VelocityContainer;
 
 /**
  * Description:<br>
@@ -51,7 +51,7 @@ public class DateComponentFactory {
 	 * @return the date component
 	 */
 	public static DateComponent createDateComponentWithYear(String name,
-			Date date, Container container) {
+			Date date, VelocityContainer container) {
 		DateComponent comp = new DateComponent(name, date, true);
 		if (container != null) {
 			container.put(name, comp);
@@ -77,7 +77,7 @@ public class DateComponentFactory {
 	 * @return the date component
 	 */
 	public static DateComponent createDateComponentWithoutYear(String name,
-			Date date, Container container) {
+			Date date, VelocityContainer container) {
 		DateComponent comp = new DateComponent(name, date, false);
 		if (container != null) {
 			container.put(name, comp);
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
index 6fc738ada0e..6f3d7cbbd96 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java
@@ -47,7 +47,7 @@ import org.apache.commons.fileupload.util.Streams;
 import org.olat.core.gui.GUIInterna;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.Container;
+import org.olat.core.gui.components.ComponentCollection;
 import org.olat.core.gui.components.form.flexible.FormBaseComponentIdProvider;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -156,13 +156,13 @@ public class Form extends LogDelegator {
 	private String eventFieldId;
 
 	// the real form
-	private FormItemContainer formLayout = null;
+	private FormItemContainer formLayout;
 	private FormWrapperContainer formWrapperComponent;
 	private Integer action;
 	private boolean hasAlreadyFired;
 	private List<FormBasicController> formListeners;
 	private boolean isValidAndSubmitted=true;
-	private FormItem submitFormItem = null;
+	private FormItem submitFormItem;
 	private boolean isDirtyMarking=true;
 	private boolean multipartEnabled = false;
 	private int multipartUploadMaxSizeKB = 0;
@@ -202,7 +202,7 @@ public class Form extends LogDelegator {
 		// this is where the formitems go to
 		form.formLayout = formLayout;
 		form.formLayout.setRootForm(form);
-		form.formListeners = new ArrayList<FormBasicController>();
+		form.formListeners = new ArrayList<FormBasicController>(1);
 		if(listener instanceof FormBasicController){
 			form.formListeners.add((FormBasicController)listener);
 		}
@@ -212,7 +212,7 @@ public class Form extends LogDelegator {
 		// renders header + <formLayout> + footer of html form
 		form.formWrapperComponent = new FormWrapperContainer(id, name, translator, form);
 		form.formWrapperComponent.addListener(listener);
-		form.formWrapperComponent.put(formLayout.getComponent().getComponentName(), formLayout.getComponent());
+		//form.formWrapperComponent.put(formLayout.getComponent().getComponentName(), formLayout.getComponent());
 		// generate name for form and dispatch uri hidden field
 
 		form.formName = Form.FORMID + form.formWrapperComponent.getDispatchID();
@@ -526,11 +526,11 @@ public class Form extends LogDelegator {
 	/**
 	 * @return
 	 */
-	Container getFormLayout() {
-		return (Container) formLayout.getComponent();
+	ComponentCollection getFormLayout() {
+		return (ComponentCollection) formLayout.getComponent();
 	}
 
-	public Container getInitialComponent() {
+	public Component getInitialComponent() {
 		return formWrapperComponent;
 	}
 
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java
index 2274ce8da6b..c5fdb0d9565 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBasicController.java
@@ -33,7 +33,7 @@ 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.FormUIFactory;
 import org.olat.core.gui.components.form.flexible.elements.InlineElement;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Disposable;
 import org.olat.core.gui.control.Event;
@@ -80,7 +80,7 @@ public abstract class FormBasicController extends BasicController {
 
 	protected Form mainForm;
 
-	protected Panel initialPanel;
+	protected StackedPanel initialPanel;
 
 	protected FormUIFactory uifactory = FormUIFactory.getInstance();
 	
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormWrapperContainer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormWrapperContainer.java
index b0bb99c4695..00814593e69 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormWrapperContainer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormWrapperContainer.java
@@ -25,14 +25,19 @@
 */ 
 package org.olat.core.gui.components.form.flexible.impl;
 
+import java.util.Collections;
+import java.util.Map;
+
 import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.AbstractComponent;
+import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.ComponentCollection;
 import org.olat.core.gui.components.ComponentRenderer;
-import org.olat.core.gui.components.Container;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.render.ValidationResult;
 import org.olat.core.gui.translator.Translator;
 
-class FormWrapperContainer extends Container {
+class FormWrapperContainer extends AbstractComponent implements ComponentCollection {
 
 	// Renderer
 	private static ComponentRenderer RENDERER = new FormWrapperContainerRenderer();
@@ -67,10 +72,28 @@ class FormWrapperContainer extends Container {
 	/**
 	 * @return
 	 */
-	Container getFormLayout() {
+	ComponentCollection getFormLayout() {
 		return form.getFormLayout();
 	}
 
+	@Override
+	public Component getComponent(String name) {
+		if(form.getFormLayout().getComponentName().equals(name)) {
+			return form.getFormLayout();
+		}
+		return null;
+	}
+
+	@Override
+	public Iterable<Component> getComponents() {
+		return Collections.<Component>singletonList(form.getFormLayout());
+	}
+
+	@Override
+	public Map<String, Component> getComponentMap() {
+		return Collections.<String, Component>singletonMap(form.getFormLayout().getComponentName(), form.getFormLayout());
+	}
+
 	/**
 	 * @return true: form contains multipart elements; false: form does not contain multipart elements
 	 */
@@ -83,9 +106,7 @@ class FormWrapperContainer extends Container {
 	 */
 	@Override
 	protected void doDispatchRequest(UserRequest ureq) {
-		//
 		form.evalFormRequest(ureq);
-		//
 	}
 
 	/**
@@ -109,8 +130,6 @@ class FormWrapperContainer extends Container {
 			fireEvent(ureq, org.olat.core.gui.components.form.Form.EVNT_VALIDATION_NOK);
 		}
 	}
-
-	
 	
 	/**
 	 * @see org.olat.core.gui.components.Component#validate(org.olat.core.gui.UserRequest, org.olat.core.gui.render.ValidationResult)
@@ -134,6 +153,4 @@ class FormWrapperContainer extends Container {
 	public void fireFormEvent(UserRequest ureq, FormEvent event) {
 		fireEvent(ureq, event);
 	}
-
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormWrapperContainerRenderer.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormWrapperContainerRenderer.java
index 08add6ddf37..704083df7fa 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormWrapperContainerRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormWrapperContainerRenderer.java
@@ -29,8 +29,8 @@ import java.util.HashSet;
 import java.util.Set;
 
 import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.ComponentCollection;
 import org.olat.core.gui.components.ComponentRenderer;
-import org.olat.core.gui.components.Container;
 import org.olat.core.gui.control.winmgr.AJAXFlags;
 import org.olat.core.gui.render.RenderResult;
 import org.olat.core.gui.render.Renderer;
@@ -66,7 +66,7 @@ class FormWrapperContainerRenderer implements ComponentRenderer {
 	public void render(Renderer renderer, StringOutput sb, Component source, URLBuilder ubu, Translator translator,
 			RenderResult renderResult, String[] args) {
 		FormWrapperContainer formC = (FormWrapperContainer) source;
-		Container toRender = formC.getFormLayout();
+		ComponentCollection toRender = formC.getFormLayout();
 
 		/*
 		 * extract check for render instruction to the form wrapper
@@ -138,7 +138,7 @@ class FormWrapperContainerRenderer implements ComponentRenderer {
 	@Override
 	public void renderBodyOnLoadJSFunctionCall(Renderer renderer, StringOutput sb, Component source, RenderingState rstate) {
 		FormWrapperContainer formC = (FormWrapperContainer) source;
-		Container toRender = formC.getFormLayout();
+		ComponentCollection toRender = formC.getFormLayout();
 		if (toRender != null) {
 			renderer.renderBodyOnLoadJSFunctionCall(sb, toRender, rstate);
 		}
@@ -156,7 +156,7 @@ class FormWrapperContainerRenderer implements ComponentRenderer {
 	public void renderHeaderIncludes(Renderer renderer, StringOutput sb, Component source, URLBuilder ubu, Translator translator,
 			RenderingState rstate) {
 		FormWrapperContainer formC = (FormWrapperContainer) source;
-		Container toRender = formC.getFormLayout();
+		ComponentCollection toRender = formC.getFormLayout();
 		if (toRender != null) {
 			renderer.renderHeaderIncludes(sb, toRender, rstate);
 		}
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableComponent.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableComponent.java
index 6446a8fb0b1..b1076b31285 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableComponent.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableComponent.java
@@ -26,7 +26,9 @@
 package org.olat.core.gui.components.form.flexible.impl.elements.table;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
@@ -93,6 +95,11 @@ public class FlexiTableComponent extends FormBaseComponentImpl implements Compon
 		return cmp;
 	}
 
+	@Override
+	public Map<String, Component> getComponentMap() {
+		return Collections.emptyMap();
+	}
+
 	/**
 	 * @see org.olat.core.gui.components.Component#getHTMLRendererSingleton()
 	 */
diff --git a/src/main/java/org/olat/core/gui/components/panel/LayeredPanel.java b/src/main/java/org/olat/core/gui/components/panel/LayeredPanel.java
index 84ef2776f67..c1e1ad7b727 100644
--- a/src/main/java/org/olat/core/gui/components/panel/LayeredPanel.java
+++ b/src/main/java/org/olat/core/gui/components/panel/LayeredPanel.java
@@ -35,7 +35,7 @@ import org.olat.core.gui.components.ComponentRenderer;
  * 
  * @author gnaegi
  */
-public class LayeredPanel extends Panel {
+public class LayeredPanel extends StackedPanel {
 	private static final ComponentRenderer LAYERED_RENDERER = new LayeredPanelRenderer();
 	private int startLayerIndex;
 	private int indexIncrement;
diff --git a/src/main/java/org/olat/core/gui/components/panel/MainPanel.java b/src/main/java/org/olat/core/gui/components/panel/MainPanel.java
index 1643e2521ab..46853114e85 100644
--- a/src/main/java/org/olat/core/gui/components/panel/MainPanel.java
+++ b/src/main/java/org/olat/core/gui/components/panel/MainPanel.java
@@ -24,7 +24,7 @@ import org.olat.core.gui.components.ComponentRenderer;
 /**
  * 
  * This component wrapped the content to mimic
- * the 3 columsn main controller with only
+ * the 3 columns main controller with only
  * one column.
  * 
  * 
diff --git a/src/main/java/org/olat/core/gui/components/panel/OncePanel.java b/src/main/java/org/olat/core/gui/components/panel/OncePanel.java
index 938d2f9497a..7ad7a947c36 100644
--- a/src/main/java/org/olat/core/gui/components/panel/OncePanel.java
+++ b/src/main/java/org/olat/core/gui/components/panel/OncePanel.java
@@ -25,8 +25,16 @@
 */ 
 package org.olat.core.gui.components.panel;
 
+import java.util.Collections;
+import java.util.Map;
+
 import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.AbstractComponent;
+import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.ComponentCollection;
+import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.render.ValidationResult;
+import org.olat.core.logging.AssertException;
 
 /**
  * Description:<br>
@@ -37,10 +45,12 @@ import org.olat.core.gui.render.ValidationResult;
  * Initial Date: 19.01.2007 <br>
  * @author Felix Jost, http://www.goodsolutions.ch
  */
-public class OncePanel extends Panel {
+public class OncePanel extends AbstractComponent implements ComponentCollection {
+	private static final ComponentRenderer RENDERER = new PanelRenderer();
 
 	private boolean hideOnNextValidate;
-
+	private Component curContent;
+	
 	/**
 	 * @param name
 	 */
@@ -48,9 +58,57 @@ public class OncePanel extends Panel {
 		super(name);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.olat.core.gui.components.Component#validate(org.olat.core.gui.UserRequest, org.olat.core.gui.render.ValidationResult)
+	/**
+	 * @return
+	 */
+	public Component getContent() {
+		return curContent;
+	}
+	
+	/**
+	 * clears the stack and sets the base content anew.
+	 * 
+	 * @param newContent the newContent. if null, then the panel will be empty
 	 */
+	public void setContent(Component newContent) {
+		curContent = newContent;
+		setDirty(true);
+	}
+
+	@Override
+	public Component getComponent(String name) {
+		if(curContent != null && curContent.getComponentName().equals(name)) {
+			return curContent;
+		}
+		return null;
+	}
+
+	@Override
+	public Iterable<Component> getComponents() {
+		if(curContent == null) {
+			return Collections.emptyList();
+		}
+		return Collections.singletonList(curContent);
+	}
+
+	@Override
+	public Map<String, Component> getComponentMap() {
+		if(curContent == null) {
+			return Collections.emptyMap();
+		}
+		return Collections.singletonMap(curContent.getComponentName(), curContent);
+	}
+	
+	@Override
+	protected void doDispatchRequest(UserRequest ureq) {
+		throw new AssertException("a panel should never dispatch a request (unless it has droppables, which it has not), ureq = "+ureq);
+	}
+
+	@Override
+	public ComponentRenderer getHTMLRendererSingleton() {
+		return RENDERER;
+	}
+
 	@Override
 	public void validate(UserRequest ureq, ValidationResult vr) {
 		super.validate(ureq, vr);
diff --git a/src/main/java/org/olat/core/gui/components/panel/Panel.java b/src/main/java/org/olat/core/gui/components/panel/Panel.java
index d2b046a39f5..a0c078f4374 100644
--- a/src/main/java/org/olat/core/gui/components/panel/Panel.java
+++ b/src/main/java/org/olat/core/gui/components/panel/Panel.java
@@ -1,59 +1,48 @@
 /**
-* 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>
-*/ 
-
+ * <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.panel;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Collections;
+import java.util.Map;
 
 import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.ComponentCollection;
 import org.olat.core.gui.components.ComponentRenderer;
-import org.olat.core.gui.components.Container;
 import org.olat.core.logging.AssertException;
 
 /**
- * Description: <br>
- * The panel implements a place holder component with a stack to hold zero, one
- * or more components. Only the highest component on the stack is shown.
  * 
- * @author Felix Jost
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
  */
-public class Panel extends Container {
+public class Panel extends AbstractComponent implements ComponentCollection {
 	private static final ComponentRenderer RENDERER = new PanelRenderer();
 
 	private Component curContent;
-	protected final List<Component> stackList = new ArrayList<Component>(3); // allow access to extending classes
-
 	/**
 	 * @param name
 	 */
 	public Panel(String name) {
 		super(name);
-		curContent = null;
 	}
 
 	/**
@@ -72,72 +61,50 @@ public class Panel extends Container {
 	public Component getContent() {
 		return curContent;
 	}
-
-	/**
-	 * @see org.olat.core.gui.components.Container#put(org.olat.core.gui.components.Component)
-	 */
-	public void put(Component component) {
-		throw new AssertException("please don't use put(comp) in a panel, but setContent(component) or pushContent(component)");
-	}
-
+	
 	/**
 	 * clears the stack and sets the base content anew.
 	 * 
 	 * @param newContent the newContent. if null, then the panel will be empty
 	 */
 	public void setContent(Component newContent) {
-		stackList.clear();
-		clear();
-		if (newContent != null) {
-			pushContent(newContent);
-		} else {
-			curContent = null;
-		}
+		curContent = newContent;
 		setDirty(true);
 	}
 
-	/**
-	 * @param newContent may not be null
-	 */
-	public void pushContent(Component newContent) {
-		if (curContent != null) super.remove(curContent);
-		super.put("pc", newContent); // add in tree for later rendering;
-		stackList.add(newContent);
-		curContent = newContent;
-		setDirty(true);
+	@Override
+	public Component getComponent(String name) {
+		if(curContent != null && curContent.getComponentName().equals(name)) {
+			return curContent;
+		}
+		return null;
 	}
 
-	/**
-	 * 
-	 */
-	public void popContent() {
-		int stackHeight = stackList.size();
-		if (stackHeight < 1) throw new AssertException("stack was empty!");
-		if (curContent == null) throw new AssertException("stackHeight not zero, but curContent was null!");
-		// remove the current active component as the containers child
-		super.remove(curContent);
-		stackList.remove(stackHeight - 1); // remove the top component
-		if (stackHeight == 1) { // after pop, the content is null
-			curContent = null;
-		} else { // stackHeight > 1
-			curContent = stackList.get(stackHeight - 2);
-			super.put("pc", curContent); // set it as the container's child
+	@Override
+	public Iterable<Component> getComponents() {
+		if(curContent == null) {
+			return Collections.emptyList();
 		}
-		setDirty(true);
+		return Collections.singletonList(curContent);
+	}
+
+	@Override
+	public Map<String, Component> getComponentMap() {
+		if(curContent == null) {
+			return Collections.emptyMap();
+		}
+		return Collections.singletonMap(curContent.getComponentName(), curContent);
 	}
 
 	/**
-	 * @see org.olat.core.gui.components.Container#getExtendedDebugInfo()
+	 * @see org.olat.core.gui.components.Component#getExtendedDebugInfo()
 	 */
+	@Override
 	public String getExtendedDebugInfo() {
 		StringBuilder sb = new StringBuilder();
-		int size = stackList.size();
-		for (int i = 0; i < size; i++) {
-			Component comp = stackList.get(i); // may be null
-			String compName = (comp == null ? "NULL" : comp.getComponentName());
-			sb.append(compName).append(" | ");
-		}
-		return "stacksize:" + size + ", active:" + sb.toString();
+		String compName = (curContent == null ? "NULL" : curContent.getComponentName());
+		sb.append(compName).append(" | ");
+		return "stacksize:1, active:" + sb.toString();
 	}
 
 	public ComponentRenderer getHTMLRendererSingleton() {
diff --git a/src/main/java/org/olat/core/gui/components/panel/PanelRenderer.java b/src/main/java/org/olat/core/gui/components/panel/PanelRenderer.java
index fcc498fd0fc..7a5ec29fcaa 100644
--- a/src/main/java/org/olat/core/gui/components/panel/PanelRenderer.java
+++ b/src/main/java/org/olat/core/gui/components/panel/PanelRenderer.java
@@ -1,32 +1,26 @@
 /**
-* 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>
-*/ 
-
+ * <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.panel;
 
 import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.ComponentCollection;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.render.RenderResult;
 import org.olat.core.gui.render.Renderer;
@@ -36,59 +30,34 @@ import org.olat.core.gui.render.URLBuilder;
 import org.olat.core.gui.translator.Translator;
 
 /**
- * Description: <br>
  * 
- * @author Felix Jost
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
  */
 public class PanelRenderer implements ComponentRenderer {
 
-	/**
-	 * 
-	 */
-	public PanelRenderer() {
-	//
-	}
-
-	/**
-	 * @see org.olat.core.gui.render.ui.ComponentRenderer#render(org.olat.core.gui.render.Renderer,
-	 *      org.olat.core.gui.render.StringOutput, org.olat.core.gui.components.Component,
-	 *      org.olat.core.gui.render.URLBuilder, org.olat.core.gui.translator.Translator,
-	 *      org.olat.core.gui.render.RenderResult, java.lang.String[])
-	 */
+	@Override
 	public void render(Renderer renderer, StringOutput sb, Component source, URLBuilder ubu, Translator translator,
 			RenderResult renderResult, String[] args) {
-		Panel panel = (Panel) source;
-		
-		Component toRender = panel.getContent();
-		if (toRender != null) {
-			//FIXME:fj: replace , args with , null ?
+		ComponentCollection panel = (ComponentCollection) source;
+		for(Component toRender:panel.getComponents()) {
 			renderer.render(sb, toRender, args);
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.render.ui.ComponentRenderer#renderHeaderIncludes(org.olat.core.gui.render.Renderer,
-	 *      org.olat.core.gui.render.StringOutput, org.olat.core.gui.components.Component,
-	 *      org.olat.core.gui.render.URLBuilder, org.olat.core.gui.translator.Translator)
-	 */
+	@Override
 	public void renderHeaderIncludes(Renderer renderer, StringOutput sb, Component source, URLBuilder ubu, Translator translator, RenderingState rstate) {
-		Panel panel = (Panel) source;
-		Component toRender = panel.getContent();
-		if (toRender != null) {
+		ComponentCollection panel = (ComponentCollection) source;
+		for(Component toRender:panel.getComponents()) {
 			// delegate header rendering to the content
 			renderer.renderHeaderIncludes(sb, toRender, rstate);
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.render.ui.ComponentRenderer#renderBodyOnLoadJSFunctionCall(org.olat.core.gui.render.Renderer,
-	 *      org.olat.core.gui.render.StringOutput, org.olat.core.gui.components.Component)
-	 */
+	@Override
 	public void renderBodyOnLoadJSFunctionCall(Renderer renderer, StringOutput sb, Component source, RenderingState rstate) {
-		Panel panel = (Panel) source;
-		Component toRender = panel.getContent();
-		
-		if (toRender != null) {
+		ComponentCollection panel = (ComponentCollection) source;
+		for(Component toRender:panel.getComponents()) {
 			// delegate header rendering to the content
 			renderer.renderBodyOnLoadJSFunctionCall(sb, toRender, rstate);
 		}
diff --git a/src/main/java/org/olat/core/gui/components/panel/StackedPanel.java b/src/main/java/org/olat/core/gui/components/panel/StackedPanel.java
new file mode 100644
index 00000000000..2114fa366be
--- /dev/null
+++ b/src/main/java/org/olat/core/gui/components/panel/StackedPanel.java
@@ -0,0 +1,156 @@
+/**
+* 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.panel;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.AbstractComponent;
+import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.ComponentCollection;
+import org.olat.core.gui.components.ComponentRenderer;
+import org.olat.core.logging.AssertException;
+
+/**
+ * Description: <br>
+ * The panel implements a place holder component with a stack to hold zero, one
+ * or more components. Only the highest component on the stack is shown.
+ * 
+ * @author Felix Jost
+ */
+public class StackedPanel extends AbstractComponent implements ComponentCollection {
+	private static final ComponentRenderer RENDERER = new PanelRenderer();
+
+	private Component curContent;
+	protected final List<Component> stackList = new ArrayList<Component>(3); // allow access to extending classes
+
+	/**
+	 * @param name
+	 */
+	public StackedPanel(String name) {
+		super(name);
+	}
+
+	/**
+	 * since the Panel does and shown nothing (is only a convenient boundary to
+	 * put components into, and to swap them), we dispatch the request to the
+	 * delegate
+	 * @param ureq
+	 */
+	protected void doDispatchRequest(UserRequest ureq) {
+		throw new AssertException("a panel should never dispatch a request (unless it has droppables, which it has not), ureq = "+ureq);
+	}
+
+	/**
+	 * @return
+	 */
+	public Component getContent() {
+		return curContent;
+	}
+
+	@Override
+	public Component getComponent(String name) {
+		if(curContent != null && curContent.getComponentName().equals(name)) {
+			return curContent;
+		}
+		return null;
+	}
+
+	@Override
+	public Iterable<Component> getComponents() {
+		if(curContent == null) {
+			return Collections.emptyList();
+		}
+		return Collections.singletonList(curContent);
+	}
+
+	@Override
+	public Map<String, Component> getComponentMap() {
+		if(curContent == null) {
+			return Collections.emptyMap();
+		}
+		return Collections.singletonMap(curContent.getComponentName(), curContent);
+	}
+
+	/**
+	 * clears the stack and sets the base content anew.
+	 * 
+	 * @param newContent the newContent. if null, then the panel will be empty
+	 */
+	public void setContent(Component newContent) {
+		stackList.clear();
+		if (newContent != null) {
+			pushContent(newContent);
+		} else {
+			curContent = null;
+		}
+		setDirty(true);
+	}
+
+	/**
+	 * @param newContent may not be null
+	 */
+	public void pushContent(Component newContent) {
+		stackList.add(newContent);
+		curContent = newContent;
+		setDirty(true);
+	}
+
+	public void popContent() {
+		int stackHeight = stackList.size();
+		if (stackHeight < 1) throw new AssertException("stack was empty!");
+		if (curContent == null) throw new AssertException("stackHeight not zero, but curContent was null!");
+		stackList.remove(stackHeight - 1); // remove the top component
+		if (stackHeight == 1) { // after pop, the content is null
+			curContent = null;
+		} else { // stackHeight > 1
+			curContent = stackList.get(stackHeight - 2);
+		}
+		setDirty(true);
+	}
+
+	/**
+	 * @see org.olat.core.gui.components.Component#getExtendedDebugInfo()
+	 */
+	public String getExtendedDebugInfo() {
+		StringBuilder sb = new StringBuilder();
+		int size = stackList.size();
+		for (int i = 0; i < size; i++) {
+			Component comp = stackList.get(i); // may be null
+			String compName = (comp == null ? "NULL" : comp.getComponentName());
+			sb.append(compName).append(" | ");
+		}
+		return "stacksize:" + size + ", active:" + sb.toString();
+	}
+
+	public ComponentRenderer getHTMLRendererSingleton() {
+		return RENDERER;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/components/tabbedpane/TabbedPane.java b/src/main/java/org/olat/core/gui/components/tabbedpane/TabbedPane.java
index e310ecf889c..ad6c2fc5a55 100644
--- a/src/main/java/org/olat/core/gui/components/tabbedpane/TabbedPane.java
+++ b/src/main/java/org/olat/core/gui/components/tabbedpane/TabbedPane.java
@@ -225,7 +225,7 @@ public class TabbedPane extends Container implements Activateable2 {
 	}
 
 	/**
-	 * @see org.olat.core.gui.components.Container#getExtendedDebugInfo()
+	 * @see org.olat.core.gui.components.Component#getExtendedDebugInfo()
 	 */
 	public String getExtendedDebugInfo() {
 		return "selectedPane:" + selectedPane;
diff --git a/src/main/java/org/olat/core/gui/components/tabbedpane/TabbedPaneChangedEvent.java b/src/main/java/org/olat/core/gui/components/tabbedpane/TabbedPaneChangedEvent.java
index 9092195f5be..295a0e2fe9f 100644
--- a/src/main/java/org/olat/core/gui/components/tabbedpane/TabbedPaneChangedEvent.java
+++ b/src/main/java/org/olat/core/gui/components/tabbedpane/TabbedPaneChangedEvent.java
@@ -34,6 +34,8 @@ import org.olat.core.gui.control.Event;
  */
 public class TabbedPaneChangedEvent extends Event {
 
+	private static final long serialVersionUID = 2481268566284582151L;
+
 	/**
 	 * <code>TAB_CHANGED</code>
 	 */
diff --git a/src/main/java/org/olat/core/gui/components/util/ComponentUtil.java b/src/main/java/org/olat/core/gui/components/util/ComponentUtil.java
index de2ed8c0aff..c98de4a2706 100644
--- a/src/main/java/org/olat/core/gui/components/util/ComponentUtil.java
+++ b/src/main/java/org/olat/core/gui/components/util/ComponentUtil.java
@@ -26,7 +26,6 @@
 package org.olat.core.gui.components.util;
 
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.Container;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -46,7 +45,7 @@ public class ComponentUtil {
 	
 	private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(ComponentUtil.class);
 
-	public static void registerForValidateEvents(Container parentContainer, Controller listeningController) {
+	public static void registerForValidateEvents(VelocityContainer parentContainer, Controller listeningController) {
 		ValidateForwardComponent vfc = new ValidateForwardComponent("validatecomp");
 		vfc.addListener(listeningController);
 		parentContainer.put("o_validate"+vfc.getDispatchID(), vfc);
diff --git a/src/main/java/org/olat/core/gui/components/velocity/VelocityContainer.java b/src/main/java/org/olat/core/gui/components/velocity/VelocityContainer.java
index 46930b72731..5582c35cc10 100644
--- a/src/main/java/org/olat/core/gui/components/velocity/VelocityContainer.java
+++ b/src/main/java/org/olat/core/gui/components/velocity/VelocityContainer.java
@@ -166,7 +166,7 @@ public class VelocityContainer extends Container {
 	}
 
 	/**
-	 * @see org.olat.core.gui.components.Container#getExtendedDebugInfo()
+	 * @see org.olat.core.gui.components.Component#getExtendedDebugInfo()
 	 */
 	public String getExtendedDebugInfo() {
 		return "page:"+page+" "+super.getExtendedDebugInfo();
diff --git a/src/main/java/org/olat/core/gui/control/DefaultController.java b/src/main/java/org/olat/core/gui/control/DefaultController.java
index 37bb16fd638..53675082da3 100644
--- a/src/main/java/org/olat/core/gui/control/DefaultController.java
+++ b/src/main/java/org/olat/core/gui/control/DefaultController.java
@@ -35,7 +35,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.OLATResourceable;
@@ -68,7 +68,7 @@ public abstract class DefaultController implements Controller, ControllerEventLi
 	private List<ControllerEventListener> listeners;
 	private Component initialComponent;
 	private boolean disposed = false;
-	private Panel wrapperPanel;
+	private StackedPanel wrapperPanel;
 	private final IUserActivityLogger userActivityLogger;
 	
 	private WindowControl newWControl;
@@ -301,10 +301,10 @@ public abstract class DefaultController implements Controller, ControllerEventLi
 		// we also take care that no event is deliverd to implementors of this
 		// abstract class after this controller has been disposed
 		
-		if (initialComponent instanceof Panel) {
-			wrapperPanel = (Panel) initialComponent;
+		if (initialComponent instanceof StackedPanel) {
+			wrapperPanel = (StackedPanel) initialComponent;
 		} else {
-			wrapperPanel = new Panel("autowrapper of controller " + this.getClass().getName());
+			wrapperPanel = new StackedPanel("autowrapper of controller " + this.getClass().getName());
 			wrapperPanel.setContent(initialComponent);
 		}
 		this.initialComponent = wrapperPanel;
diff --git a/src/main/java/org/olat/core/gui/control/controller/BasicController.java b/src/main/java/org/olat/core/gui/control/controller/BasicController.java
index bdfb501818b..5a957757b52 100644
--- a/src/main/java/org/olat/core/gui/control/controller/BasicController.java
+++ b/src/main/java/org/olat/core/gui/control/controller/BasicController.java
@@ -34,7 +34,7 @@ import org.olat.core.dispatcher.mapper.Mapper;
 import org.olat.core.dispatcher.mapper.MapperService;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.DefaultController;
@@ -267,15 +267,15 @@ public abstract class BasicController extends DefaultController {
 				+ ".html", translator, this);
 	}
 
-	protected Panel putInitialPanel(Component initialContent) {
-		Panel p = new Panel("mainPanel");
+	protected StackedPanel putInitialPanel(Component initialContent) {
+		StackedPanel p = new StackedPanel("mainPanel");
 		p.setContent(initialContent);
 		super.setInitialComponent(p);
 		return p;
 	}
 
-	protected void setInitialComponent(@SuppressWarnings("unused")
-	Component initialComponent) {
+	@Override
+	protected void setInitialComponent(Component initialComponent) {
 		throw new AssertException("please use method putInitialPanel!");
 	}
 
diff --git a/src/main/java/org/olat/core/gui/control/generic/docking/DockController.java b/src/main/java/org/olat/core/gui/control/generic/docking/DockController.java
index c2ec497bc49..4075afbc659 100644
--- a/src/main/java/org/olat/core/gui/control/generic/docking/DockController.java
+++ b/src/main/java/org/olat/core/gui/control/generic/docking/DockController.java
@@ -29,7 +29,7 @@ package org.olat.core.gui.control.generic.docking;
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -49,7 +49,7 @@ public class DockController extends BasicController {
 	private static final String CMD_UNDOCK = "ud";
 
 	private VelocityContainer mainVC;
-	private Panel panel;
+	private StackedPanel panel;
 	private DockLayoutControllerCreatorCallback layoutCreator;
 	
 	Controller controller;
diff --git a/src/main/java/org/olat/core/gui/control/guistack/GuiStack.java b/src/main/java/org/olat/core/gui/control/guistack/GuiStack.java
index e87a362ede5..749abb0d2b7 100644
--- a/src/main/java/org/olat/core/gui/control/guistack/GuiStack.java
+++ b/src/main/java/org/olat/core/gui/control/guistack/GuiStack.java
@@ -26,7 +26,7 @@
 package org.olat.core.gui.control.guistack;
 
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 
 /**
  * Description:<br>
@@ -64,11 +64,11 @@ public interface GuiStack {
 	/**
 	 * @return
 	 */
-	public Panel getPanel();
+	public StackedPanel getPanel();
 
 	/**
 	 * @return Returns the modalPanel, which should be put so that it looks modal (e.g. alpha-blended background) may be null if no modal panel is needed
 	 */
-	public Panel getModalPanel();
+	public StackedPanel getModalPanel();
 
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/control/guistack/GuiStackNiceImpl.java b/src/main/java/org/olat/core/gui/control/guistack/GuiStackNiceImpl.java
index 8e2e9822cd2..0079218d437 100644
--- a/src/main/java/org/olat/core/gui/control/guistack/GuiStackNiceImpl.java
+++ b/src/main/java/org/olat/core/gui/control/guistack/GuiStackNiceImpl.java
@@ -30,6 +30,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.panel.LayeredPanel;
 import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.WindowBackOffice;
 import org.olat.core.gui.control.util.ZIndexWrapper;
@@ -44,8 +45,8 @@ import org.olat.core.util.Util;
 public class GuiStackNiceImpl implements GuiStack {
 	private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(GuiStackNiceImpl.class);
 	
-	private Panel panel;
-	private Panel modalPanel;
+	private StackedPanel panel;
+	private StackedPanel modalPanel;
 	private int modalLayers;
 
 	private WindowBackOffice wbo;
@@ -54,7 +55,7 @@ public class GuiStackNiceImpl implements GuiStack {
 	 * 
 	 */
 	private GuiStackNiceImpl() {
-		panel = new Panel("guistackpanel");
+		panel = new StackedPanel("guistackpanel");
 		// Use a layered panel instead of a standard panel to support multiple modal layers
 		modalPanel = new LayeredPanel("guistackmodalpanel", 900, 100);
 		modalLayers = 0;
@@ -185,14 +186,14 @@ public class GuiStackNiceImpl implements GuiStack {
 	/**
 	 * @return
 	 */
-	public Panel getPanel() {
+	public StackedPanel getPanel() {
 		return panel;
 	}
 
 	/**
 	 * @return Returns the modalPanel.
 	 */
-	public Panel getModalPanel() {
+	public StackedPanel getModalPanel() {
 		return modalPanel;
 	}
 
diff --git a/src/main/java/org/olat/core/gui/control/guistack/GuiStackSimpleImpl.java b/src/main/java/org/olat/core/gui/control/guistack/GuiStackSimpleImpl.java
index b9addafaee7..89122e74ee0 100644
--- a/src/main/java/org/olat/core/gui/control/guistack/GuiStackSimpleImpl.java
+++ b/src/main/java/org/olat/core/gui/control/guistack/GuiStackSimpleImpl.java
@@ -26,7 +26,7 @@
 package org.olat.core.gui.control.guistack;
 
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.util.Util;
 
@@ -41,13 +41,13 @@ import org.olat.core.util.Util;
 public class GuiStackSimpleImpl implements GuiStack {
 	private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(GuiStackSimpleImpl.class);
 	
-	private Panel contentPanel;
+	private StackedPanel contentPanel;
 	
 	/**
 	 * 
 	 */
 	public GuiStackSimpleImpl(Component initialComponent) {
-		contentPanel = new Panel("simpleguistack");
+		contentPanel = new StackedPanel("simpleguistack");
 		contentPanel.setContent(initialComponent);
 	}
 
@@ -83,14 +83,14 @@ public class GuiStackSimpleImpl implements GuiStack {
 	/* (non-Javadoc)
 	 * @see org.olat.core.gui.control.GuiStack#getPanel()
 	 */
-	public Panel getPanel() {
+	public StackedPanel getPanel() {
 		return contentPanel;
 	}
 
 	/* (non-Javadoc)
 	 * @see org.olat.core.gui.control.GuiStack#getModalPanel()
 	 */
-	public Panel getModalPanel() {
+	public StackedPanel getModalPanel() {
 		return null;
 	}
 
diff --git a/src/main/java/org/olat/core/gui/dev/controller/DevelopmentController.java b/src/main/java/org/olat/core/gui/dev/controller/DevelopmentController.java
index 97bde4f22e2..5537d7e10e6 100644
--- a/src/main/java/org/olat/core/gui/dev/controller/DevelopmentController.java
+++ b/src/main/java/org/olat/core/gui/dev/controller/DevelopmentController.java
@@ -36,6 +36,7 @@ import java.util.Map;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.Windows;
 import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.ComponentCollection;
 import org.olat.core.gui.components.Container;
 import org.olat.core.gui.components.Window;
 import org.olat.core.gui.components.link.Link;
@@ -397,8 +398,8 @@ public class DevelopmentController extends BasicController {
 	
 	private int cntTree(Component current) {
 		int cnt = 1;
-		if (current instanceof Container) {
-			Container co = (Container) current;
+		if (current instanceof ComponentCollection) {
+			ComponentCollection co = (ComponentCollection) current;
 			for (Component child:co.getComponents()) {
 				cnt += cntTree(child);
 			}
diff --git a/src/main/java/org/olat/core/gui/render/Renderer.java b/src/main/java/org/olat/core/gui/render/Renderer.java
index 9d82a5dbb7b..e9ef3619a80 100644
--- a/src/main/java/org/olat/core/gui/render/Renderer.java
+++ b/src/main/java/org/olat/core/gui/render/Renderer.java
@@ -33,8 +33,8 @@ import org.olat.core.dispatcher.impl.StaticMediaDispatcher;
 import org.olat.core.gui.GUIInterna;
 import org.olat.core.gui.GlobalSettings;
 import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.ComponentCollection;
 import org.olat.core.gui.components.ComponentRenderer;
-import org.olat.core.gui.components.Container;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.render.intercept.InterceptHandlerInstance;
 import org.olat.core.gui.translator.Translator;
@@ -48,7 +48,7 @@ public class Renderer {
 
 	private URLBuilder urlBuilder;
 	private Translator translator;
-	private Container renderContainer;
+	private ComponentCollection renderContainer;
 	private RenderResult renderResult;
 	private GlobalSettings globalSettings;
 
@@ -60,12 +60,12 @@ public class Renderer {
 	 * @param globalSettings
 	 * @return an instance of the renderer
 	 */
-	public static Renderer getInstance(Container renderContainer, Translator translator, URLBuilder ubu, RenderResult renderResult,
+	public static Renderer getInstance(ComponentCollection renderContainer, Translator translator, URLBuilder ubu, RenderResult renderResult,
 			GlobalSettings globalSettings) {
 		return new Renderer(renderContainer, translator, ubu, renderResult, globalSettings);
 	}
 
-	private Renderer(Container renderContainer, Translator translator, URLBuilder ubu, RenderResult renderResult,
+	private Renderer(ComponentCollection renderContainer, Translator translator, URLBuilder ubu, RenderResult renderResult,
 			GlobalSettings globalSettings) {
 		this.renderContainer = renderContainer;
 		this.translator = translator;
@@ -225,7 +225,7 @@ public class Renderer {
 			if (GUIInterna.isLoadPerformanceMode()) {
 				StringBuilder pathsb = new StringBuilder();
 				Component cc = source;
-				Container ccpar = cc.getParent();
+				ComponentCollection ccpar = cc.getParent();
 				while (ccpar != null) { // omit content pane
 					// find out name under which cc was registered in its parent - that is the relevant name, not the name of the component itself
 					Map<String,Component> namedChildren = ccpar.getComponentMap();
diff --git a/src/main/java/org/olat/core/gui/render/intercept/debug/GuiDebugDispatcherController.java b/src/main/java/org/olat/core/gui/render/intercept/debug/GuiDebugDispatcherController.java
index 1334055c681..719810cc1b8 100644
--- a/src/main/java/org/olat/core/gui/render/intercept/debug/GuiDebugDispatcherController.java
+++ b/src/main/java/org/olat/core/gui/render/intercept/debug/GuiDebugDispatcherController.java
@@ -38,7 +38,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.components.delegating.DelegatingComponent;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -73,7 +73,7 @@ public class GuiDebugDispatcherController extends BasicController implements Int
 	private DelegatingComponent dc;
 	private Map<String, Component> idToComponent = new HashMap<String, Component>();
 	private PlainTextEditorController vcEditorController;
-	private Panel mainP;
+	private StackedPanel mainP;
 
 	/**
 	 * @param ureq
diff --git a/src/main/java/org/olat/core/util/i18n/ui/InlineTranslationInterceptHandlerController.java b/src/main/java/org/olat/core/util/i18n/ui/InlineTranslationInterceptHandlerController.java
index 7d0152ccc35..cddfc597467 100644
--- a/src/main/java/org/olat/core/util/i18n/ui/InlineTranslationInterceptHandlerController.java
+++ b/src/main/java/org/olat/core/util/i18n/ui/InlineTranslationInterceptHandlerController.java
@@ -29,7 +29,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.components.delegating.DelegatingComponent;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -76,7 +76,7 @@ public class InlineTranslationInterceptHandlerController extends BasicController
 	private DelegatingComponent delegatingComponent;
 	private TranslationToolI18nItemEditCrumbController i18nItemEditCtr;
 	private CloseableModalController cmc;
-	private Panel mainP;
+	private StackedPanel mainP;
 
 	// patterns to detect localized strings with identifyers
 	private static final String decoratedTranslatedPattern = "(" + I18nManager.IDENT_PREFIX + "(.*?)" + I18nManager.IDENT_START_POSTFIX
diff --git a/src/main/java/org/olat/course/DisposedCourseRestartController.java b/src/main/java/org/olat/course/DisposedCourseRestartController.java
index a2d1aae1538..5f159096792 100644
--- a/src/main/java/org/olat/course/DisposedCourseRestartController.java
+++ b/src/main/java/org/olat/course/DisposedCourseRestartController.java
@@ -29,7 +29,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -57,7 +57,7 @@ public class DisposedCourseRestartController extends BasicController {
 	private VelocityContainer initialContent;
 	private Link restartLink;
 	private RepositoryEntry courseRepositoryEntry;
-	private Panel panel;
+	private StackedPanel panel;
 
 	public DisposedCourseRestartController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseRepositoryEntry) {
 		super(ureq, wControl);
diff --git a/src/main/java/org/olat/course/archiver/CourseLogsArchiveController.java b/src/main/java/org/olat/course/archiver/CourseLogsArchiveController.java
index 53a083630e0..fee91491959 100644
--- a/src/main/java/org/olat/course/archiver/CourseLogsArchiveController.java
+++ b/src/main/java/org/olat/course/archiver/CourseLogsArchiveController.java
@@ -32,7 +32,6 @@ import java.util.Locale;
 import org.olat.core.commons.modules.bc.FolderRunController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.htmlheader.jscss.JSAndCSSComponent;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
 import org.olat.core.gui.components.panel.Panel;
@@ -214,7 +213,7 @@ public class CourseLogsArchiveController extends BasicController {
 		myPanel.setContent(vcOngoing);
 
 		// initialize polling 
-		myPanel.put("updatecontrol", new JSAndCSSComponent("intervall", this.getClass(), 3000));
+		//myPanel.put("updatecontrol", new JSAndCSSComponent("intervall", this.getClass(), 3000));
 	}
 
 	protected void showExportFinished() {
diff --git a/src/main/java/org/olat/course/archiver/ScoreAccountingArchiveController.java b/src/main/java/org/olat/course/archiver/ScoreAccountingArchiveController.java
index 295ed6f244e..b31ece1de3c 100644
--- a/src/main/java/org/olat/course/archiver/ScoreAccountingArchiveController.java
+++ b/src/main/java/org/olat/course/archiver/ScoreAccountingArchiveController.java
@@ -32,7 +32,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -56,7 +56,7 @@ import org.olat.user.UserManager;
 public class ScoreAccountingArchiveController extends BasicController {
 
 	private OLATResourceable ores;
-	private Panel myPanel;
+	private StackedPanel myPanel;
 	private VelocityContainer myContent;
 	private VelocityContainer vcFeedback;
 	private Link startButton, downloadButton;
diff --git a/src/main/java/org/olat/course/area/CourseAreasController.java b/src/main/java/org/olat/course/area/CourseAreasController.java
index 0d0b099807f..8e69e2f97f1 100644
--- a/src/main/java/org/olat/course/area/CourseAreasController.java
+++ b/src/main/java/org/olat/course/area/CourseAreasController.java
@@ -27,7 +27,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.table.DefaultColumnDescriptor;
 import org.olat.core.gui.components.table.StaticColumnDescriptor;
 import org.olat.core.gui.components.table.Table;
@@ -59,7 +59,7 @@ public class CourseAreasController extends MainLayoutBasicController {
 	private static final String TABLE_ACTION_EDIT = "tbl_edit";
 	private static final String TABLE_ACTION_DELETE = "tbl_del";
 	
-	private final Panel mainPanel;
+	private final StackedPanel mainPanel;
 	private final Link createAreaLink;
 	private final VelocityContainer mainVC;
 	private final TableController tableCtrl;
diff --git a/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java b/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
index a252f74323b..ea86bb2d5f6 100644
--- a/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
+++ b/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
@@ -37,7 +37,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -74,7 +74,7 @@ public class LTIRunController extends BasicController {
 	private static final String PROP_NAME_DATA_EXCHANGE_ACCEPTED = "LtiDataExchageAccepted";
 	
 	private Link startButton;
-	private final Panel mainPanel;
+	private final StackedPanel mainPanel;
 	private VelocityContainer run, startPage, acceptPage;
 	private BasicLTICourseNode courseNode;
 	private ModuleConfiguration config;
@@ -128,7 +128,7 @@ public class LTIRunController extends BasicController {
 		String display = config.getStringValue(BasicLTICourseNode.CONFIG_DISPLAY, "iframe");
 		this.newWindow = "window".equals(display);
 
-		mainPanel = new Panel("ltiContainer");
+		mainPanel = new StackedPanel("ltiContainer");
 		putInitialPanel(mainPanel);
 		
 		// only run directly when user as already accepted to data exchange or no data has to be exchanged
diff --git a/src/main/java/org/olat/course/nodes/iq/IQRunController.java b/src/main/java/org/olat/course/nodes/iq/IQRunController.java
index 132e3b48c80..65e6a546c14 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQRunController.java
@@ -39,6 +39,7 @@ import org.olat.core.gui.components.htmlsite.HtmlStaticPageComponent;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
 import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -117,7 +118,7 @@ public class IQRunController extends BasicController implements GenericEventList
 
 	private IFrameDisplayController iFrameCtr;
 
-	private Panel mainPanel;
+	private StackedPanel mainPanel;
 	
 	private boolean assessmentStopped = true; //default: true
 	private EventBus singleUserEventCenter;
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsPanelController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsPanelController.java
index 5fc1deca459..dac10df16b6 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsPanelController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsPanelController.java
@@ -27,7 +27,7 @@ package org.olat.course.nodes.projectbroker;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -52,7 +52,7 @@ import org.olat.course.run.environment.CourseEnvironment;
  */
 public class ProjectDetailsPanelController extends BasicController {
 	
-	private Panel detailsPanel;
+	private StackedPanel detailsPanel;
 	private ProjectEditDetailsFormController editController;
 	private ProjectDetailsDisplayController runController;
 
@@ -78,7 +78,7 @@ public class ProjectDetailsPanelController extends BasicController {
 		this.projectBrokerModuleConfiguration = projectBrokerModuleConfiguration;
 		this.newCreatedProject = newCreatedProject;
 
-		detailsPanel = new Panel("projectdetails_panel");
+		detailsPanel = new StackedPanel("projectdetails_panel");
 		runController = new ProjectDetailsDisplayController(ureq, wControl, project, courseEnv, courseNode, projectBrokerModuleConfiguration);
 		listenTo(runController);
 		detailsPanel.setContent(runController.getInitialComponent());
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectListController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectListController.java
index 591e702708b..7e96a0dc780 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectListController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectListController.java
@@ -34,7 +34,7 @@ import org.olat.core.gui.Windows;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.table.BooleanColumnDescriptor;
 import org.olat.core.gui.components.table.ColumnDescriptor;
 import org.olat.core.gui.components.table.CustomRenderColumnDescriptor;
@@ -89,7 +89,7 @@ public class ProjectListController extends BasicController implements GenericEve
 	
 
 	private VelocityContainer contentVC;
-	private Panel mainPanel;
+	private StackedPanel mainPanel;
 	private ProjectListTableModel projectListTableModel;
 	private TableController tableController;
 	private Controller projectController;
@@ -142,7 +142,7 @@ public class ProjectListController extends BasicController implements GenericEve
 			}			
 		}
 		contentVC.contextPut("infoProjectBrokerRunMode", infoProjectBrokerRunMode);
-		mainPanel = new Panel("projectlist_panel");
+		mainPanel = new StackedPanel("projectlist_panel");
 		CoursePropertyManager cpm = userCourseEnv.getCourseEnvironment().getCoursePropertyManager();
 		if (  (ProjectBrokerManagerFactory.getProjectGroupManager().isAccountManager(ureq.getIdentity(), cpm, ne.getCourseNode() ) && !previewMode)
 				|| userCourseEnv.getCourseEnvironment().getCourseGroupManager().isIdentityCourseAdministrator(ureq.getIdentity())
@@ -427,8 +427,8 @@ public class ProjectListController extends BasicController implements GenericEve
 		tableController.addColumnDescriptor(projectManagerDescriptor);
 		// Custom-Fields
 		List<CustomField> customFieldList = moduleConfig.getCustomFields();
-		for (Iterator iterator = customFieldList.iterator(); iterator.hasNext();) {
-			CustomField customField = (CustomField) iterator.next();
+		for (Iterator<CustomField> iterator = customFieldList.iterator(); iterator.hasNext();) {
+			CustomField customField = iterator.next();
 			if (customField.isTableViewEnabled()) {
 				numberOfCustomFieldInTable++;
 				DefaultColumnDescriptor columnDescriptor = new DefaultColumnDescriptor(customField.getName(), dataColumn++,null, ureq.getLocale());
diff --git a/src/main/java/org/olat/course/site/ui/DisposedCourseSiteRestartController.java b/src/main/java/org/olat/course/site/ui/DisposedCourseSiteRestartController.java
index 7b5174761b5..107c2d1f517 100644
--- a/src/main/java/org/olat/course/site/ui/DisposedCourseSiteRestartController.java
+++ b/src/main/java/org/olat/course/site/ui/DisposedCourseSiteRestartController.java
@@ -23,7 +23,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -49,7 +49,7 @@ public class DisposedCourseSiteRestartController extends BasicController {
 	private VelocityContainer initialContent;
 	private Link restartLink;
 	private RepositoryEntry courseRepositoryEntry;
-	private Panel panel;
+	private StackedPanel panel;
 
 	public DisposedCourseSiteRestartController(UserRequest ureq, WindowControl wControl, RepositoryEntry courseRepositoryEntry) {
 		super(ureq, wControl);
diff --git a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoController.java b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoController.java
index f15a984b5c4..9af078b40c7 100644
--- a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoController.java
+++ b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoController.java
@@ -27,31 +27,24 @@ package org.olat.gui.demo.guidemo;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
-import org.olat.core.logging.OLog;
-import org.olat.core.logging.Tracing;
 import org.olat.gui.demo.GUIDemoMainController;
 
 public class GuiDemoController extends BasicController {
-	//how to create a logger
-	OLog log = Tracing.createLoggerFor(GuiDemoController.class);
 
-	Panel p;
-	VelocityContainer vcMain;
+	private final VelocityContainer vcMain;
 	
 	public GuiDemoController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl);
 		setBasePackage(GUIDemoMainController.class);
 		//simple Text as first node in the guidemo tree
 		vcMain = createVelocityContainer("guidemo");
-		p = putInitialPanel(vcMain);
+		putInitialPanel(vcMain);
 	}
 
-	@SuppressWarnings("unused")
 	public void event(UserRequest ureq, Component source, Event event) {
 		//no events to catch
 	}
diff --git a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoDialogController.java b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoDialogController.java
index 3059dfef76f..80f6d733c9c 100644
--- a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoDialogController.java
+++ b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoDialogController.java
@@ -25,7 +25,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -63,7 +63,7 @@ public class GuiDemoDialogController extends BasicController {
 	private DialogBoxController dialogBoxWithoutClose;
 	private ArrayList<String> myButtons;
 	private Link guimsgButton;
-	private Panel mainP;
+	private StackedPanel mainP;
 	private MessageController guimsg;
 
 	public GuiDemoDialogController(UserRequest ureq, WindowControl wControl) {
@@ -78,8 +78,8 @@ public class GuiDemoDialogController extends BasicController {
 		guimsgButton = LinkFactory.createButton("guidemo.dialog.guimsg", vcMain, this);
 		
 		//add source view control
-    Controller sourceview = new SourceViewController(ureq, wControl, this.getClass(), vcMain);
-    vcMain.put("sourceview", sourceview.getInitialComponent());
+		Controller sourceview = new SourceViewController(ureq, wControl, this.getClass(), vcMain);
+		vcMain.put("sourceview", sourceview.getInitialComponent());
 		
 		mainP = putInitialPanel(vcMain);
 	}
@@ -119,10 +119,10 @@ public class GuiDemoDialogController extends BasicController {
 			listenTo(guimsg);
 			mainP.pushContent(guimsg.getInitialComponent());
 		}
-
 	}
 
-	public void event(@SuppressWarnings("unused")UserRequest ureq, Controller source, Event event) {
+	@Override
+	public void event(UserRequest ureq, Controller source, Event event) {
 		String feedbackMessage = null;
 		if (source == dialogBoxOne) {
 			if (event == Event.CANCELLED_EVENT) {
diff --git a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiFormMainController.java b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiFormMainController.java
index 9ebf83edbc3..7b56593c530 100644
--- a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiFormMainController.java
+++ b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFlexiFormMainController.java
@@ -34,12 +34,13 @@ import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
 import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
-import org.olat.core.gui.control.creator.ControllerCreator;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
+import org.olat.core.gui.control.creator.ControllerCreator;
 import org.olat.core.gui.control.generic.spacesaver.ShrinkController;
 import org.olat.core.gui.dev.controller.SourceViewController;
 
@@ -58,7 +59,7 @@ public class GuiDemoFlexiFormMainController extends BasicController {
 	private Map<String, ControllerCreator> demos = new HashMap<String, ControllerCreator>();
 	List<String> demolinknames;
 	private Controller demoController;
-	private Panel contentP;
+	private StackedPanel contentP;
 	private VelocityContainer content_sourceVC;
 	private Panel sourceP;
 	{
@@ -118,7 +119,7 @@ public class GuiDemoFlexiFormMainController extends BasicController {
 		mainVC.contextPut("demolinknames", demolinknames);
 
 		// all democontroller content goes in this panel
-		contentP = new Panel("content");
+		contentP = new StackedPanel("content");
 		content_sourceVC = createVelocityContainer("content_source");
 		mainVC.put("democontent", contentP);
 		//
diff --git a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoLinksController.java b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoLinksController.java
index b437df43895..32dc8d23de4 100644
--- a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoLinksController.java
+++ b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoLinksController.java
@@ -48,8 +48,7 @@ import org.olat.core.logging.OLATRuntimeException;
 
 public class GuiDemoLinksController extends BasicController {
 	
-	Panel p;
-	VelocityContainer mainVC;
+	private final VelocityContainer mainVC;
 	
 	private Link buttonXSmall;
 	private Link buttonSmall;
@@ -126,11 +125,10 @@ public class GuiDemoLinksController extends BasicController {
 		Controller sourceView = new SourceViewController(ureq, wControl, this.getClass(), mainVC);
 		mainVC.put("sourceview", sourceView.getInitialComponent());
 		
-		
 		// form buttons
 		mainVC.put("formbuttonctr",new FormButtonsDemoController(ureq, wControl).getInitialComponent());
 		
-		p = putInitialPanel(mainVC);		
+		putInitialPanel(mainVC);		
 	}
 
 	public void event(UserRequest ureq, Component source, Event event) {
diff --git a/src/main/java/org/olat/login/LoginAuthprovidersController.java b/src/main/java/org/olat/login/LoginAuthprovidersController.java
index 5e2fefbe743..2aa79e30b33 100644
--- a/src/main/java/org/olat/login/LoginAuthprovidersController.java
+++ b/src/main/java/org/olat/login/LoginAuthprovidersController.java
@@ -41,7 +41,7 @@ import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
 import org.olat.core.dispatcher.DispatcherModule;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.tree.GenericTreeModel;
 import org.olat.core.gui.components.tree.GenericTreeNode;
 import org.olat.core.gui.components.tree.MenuTree;
@@ -89,7 +89,7 @@ public class LoginAuthprovidersController extends MainLayoutBasicController impl
 	private VelocityContainer content;
 	private Controller authController;
 	private final List<Controller> authControllers = new ArrayList<Controller>();
-	private Panel dmzPanel;
+	private StackedPanel dmzPanel;
 	private GenericTreeNode checkNode;
 	private GenericTreeNode accessibilityNode;
 	private GenericTreeNode aboutNode;
@@ -110,7 +110,7 @@ public class LoginAuthprovidersController extends MainLayoutBasicController impl
 			ureq.getUserSession().removeEntryFromNonClearedStore("error.change.email.time");
 		}
 		
-		dmzPanel = new Panel("content");
+		dmzPanel = new StackedPanel("content");
 		content = initLoginContent(ureq, null);
 		dmzPanel.pushContent(content);
 
diff --git a/src/main/java/org/olat/modules/dialog/DialogElementsController.java b/src/main/java/org/olat/modules/dialog/DialogElementsController.java
index 37acc51d88c..dbb8ad47bf5 100644
--- a/src/main/java/org/olat/modules/dialog/DialogElementsController.java
+++ b/src/main/java/org/olat/modules/dialog/DialogElementsController.java
@@ -41,7 +41,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.table.TableController;
 import org.olat.core.gui.components.table.TableEvent;
 import org.olat.core.gui.components.table.TableGuiConfiguration;
@@ -110,7 +110,7 @@ public class DialogElementsController extends BasicController {
 	private CourseNode courseNode;
 	private FileUploadController fileUplCtr;
 	private LinkChooserController fileCopyCtr;
-	private Panel dialogPanel;
+	private StackedPanel dialogPanel;
 	private ForumManager forumMgr;
 	private DialogElement recentDialogElement, selectedElement;
 	private DialogElementsTableModel tableModel;
diff --git a/src/main/java/org/olat/modules/fo/FilterForUserController.java b/src/main/java/org/olat/modules/fo/FilterForUserController.java
index fb391de1989..fa7ab482487 100644
--- a/src/main/java/org/olat/modules/fo/FilterForUserController.java
+++ b/src/main/java/org/olat/modules/fo/FilterForUserController.java
@@ -38,7 +38,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.table.BaseTableDataModelWithoutFilter;
 import org.olat.core.gui.components.table.DefaultColumnDescriptor;
 import org.olat.core.gui.components.table.StaticColumnDescriptor;
@@ -104,7 +104,7 @@ public class FilterForUserController extends BasicController {
 	private final TableController userListCtr;
 	private final AutoCompleterController userAutoCompleterCtr;
 	private final DateFormat dateFormat;
-	private final Panel searchPanel;
+	private final StackedPanel searchPanel;
 	
 	private final OLATResourceable forumOres;
 	
diff --git a/src/main/java/org/olat/modules/fo/ForumController.java b/src/main/java/org/olat/modules/fo/ForumController.java
index 6946ae486b0..d564f619e49 100644
--- a/src/main/java/org/olat/modules/fo/ForumController.java
+++ b/src/main/java/org/olat/modules/fo/ForumController.java
@@ -49,7 +49,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.table.BooleanColumnDescriptor;
 import org.olat.core.gui.components.table.ColumnDescriptor;
 import org.olat.core.gui.components.table.CustomCellRenderer;
@@ -145,7 +145,7 @@ public class ForumController extends BasicController implements GenericEventList
 
 	private Collator collator; 
 
-	private Panel forumPanel;
+	private StackedPanel forumPanel;
 
 	private VelocityContainer vcListTitles;
 	private VelocityContainer vcEditMessage;
@@ -220,7 +220,7 @@ public class ForumController extends BasicController implements GenericEventList
 		collator = Collator.getInstance(ureq.getLocale());
 		collator.setStrength(Collator.PRIMARY);
 
-		forumPanel = new Panel("forumPanel");
+		forumPanel = new StackedPanel("forumPanel");
 		forumPanel.addListener(this);
 
 		//create page
diff --git a/src/main/java/org/olat/modules/wiki/WikiMainController.java b/src/main/java/org/olat/modules/wiki/WikiMainController.java
index 3236c6ef31e..841eb4e7602 100644
--- a/src/main/java/org/olat/modules/wiki/WikiMainController.java
+++ b/src/main/java/org/olat/modules/wiki/WikiMainController.java
@@ -45,6 +45,7 @@ import org.olat.core.gui.components.htmlheader.jscss.JSAndCSSComponent;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
 import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.tabbedpane.TabbedPane;
 import org.olat.core.gui.components.tabbedpane.TabbedPaneChangedEvent;
 import org.olat.core.gui.components.table.Table;
@@ -146,7 +147,7 @@ public class WikiMainController extends BasicController implements CloneableCont
 	private WikiSecurityCallback securityCallback;
 	private WikiArticleSearchForm searchOrCreateArticleForm;
 	private Controller searchCtrl;
-	private Panel mainPanel;
+	private StackedPanel mainPanel;
 	
 	public static final String ACTION_COMPARE = "compare";
 	public static final String ACTION_SHOW = "view.version";
diff --git a/src/main/java/org/olat/portfolio/ui/structel/EPMultipleMapController.java b/src/main/java/org/olat/portfolio/ui/structel/EPMultipleMapController.java
index cc93c764f24..92012a41ebb 100644
--- a/src/main/java/org/olat/portfolio/ui/structel/EPMultipleMapController.java
+++ b/src/main/java/org/olat/portfolio/ui/structel/EPMultipleMapController.java
@@ -29,7 +29,7 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.link.LinkFactory;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -90,7 +90,7 @@ public class EPMultipleMapController extends BasicController implements Activate
 	private EPMapViewController mapViewCtrl;
 	private EPShareListController shareListController;
 	private CloseableModalController shareBox;
-	private Panel myPanel;
+	private StackedPanel myPanel;
 	
 	private final EPMapRunViewOption option;
 	private final Identity mapOwner;
diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/OrdersAdminController.java b/src/main/java/org/olat/resource/accesscontrol/ui/OrdersAdminController.java
index 916b45096b4..e3af6cdbf57 100644
--- a/src/main/java/org/olat/resource/accesscontrol/ui/OrdersAdminController.java
+++ b/src/main/java/org/olat/resource/accesscontrol/ui/OrdersAdminController.java
@@ -27,7 +27,7 @@ import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.ShortName;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.table.ColumnDescriptor;
 import org.olat.core.gui.components.table.CustomRenderColumnDescriptor;
 import org.olat.core.gui.components.table.DefaultColumnDescriptor;
@@ -68,7 +68,7 @@ public class OrdersAdminController extends BasicController implements Activateab
 	
 	private static final String CMD_SELECT = "sel";
 
-	private final Panel mainPanel;
+	private final StackedPanel mainPanel;
 	private final VelocityContainer mainVC;
 	private final TableController tableCtr;
 	private OrdersSearchForm searchForm;
diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/OrdersController.java b/src/main/java/org/olat/resource/accesscontrol/ui/OrdersController.java
index 071cbe3008e..3b960dbd287 100644
--- a/src/main/java/org/olat/resource/accesscontrol/ui/OrdersController.java
+++ b/src/main/java/org/olat/resource/accesscontrol/ui/OrdersController.java
@@ -27,7 +27,7 @@ import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.ShortName;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
-import org.olat.core.gui.components.panel.Panel;
+import org.olat.core.gui.components.panel.StackedPanel;
 import org.olat.core.gui.components.table.ColumnDescriptor;
 import org.olat.core.gui.components.table.CustomRenderColumnDescriptor;
 import org.olat.core.gui.components.table.DefaultColumnDescriptor;
@@ -67,7 +67,7 @@ public class OrdersController extends BasicController implements Activateable2 {
 	
 	private static final String CMD_SELECT = "sel";
 
-	private final Panel mainPanel;
+	private final StackedPanel mainPanel;
 	private final VelocityContainer mainVC;
 	private final TableController tableCtr;
 	private OrderDetailController detailController;
-- 
GitLab