diff --git a/src/main/java/org/olat/commons/calendar/ui/components/FullCalendarComponent.java b/src/main/java/org/olat/commons/calendar/ui/components/FullCalendarComponent.java
index 40772479b3332c5620e85c22a5bfc8bcb3bc4531..f942d22af78115b1fde371d953d76a669c2f6dcf 100644
--- a/src/main/java/org/olat/commons/calendar/ui/components/FullCalendarComponent.java
+++ b/src/main/java/org/olat/commons/calendar/ui/components/FullCalendarComponent.java
@@ -29,7 +29,7 @@ import org.olat.commons.calendar.model.KalendarEvent;
 import org.olat.core.CoreSpringFactory;
 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.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.render.ValidationResult;
 import org.olat.core.gui.translator.Translator;
@@ -40,7 +40,7 @@ import org.olat.core.gui.translator.Translator;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-public class FullCalendarComponent extends Component {
+public class FullCalendarComponent extends AbstractComponent {
 	
 	private static final FullCalendarComponentRenderer RENDERER = new FullCalendarComponentRenderer();
 
diff --git a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java
index 0ec16e6d0b0d007d94d868f9bf1a3fbe4eac00e7..615dbe64b62f0e6e2a79250ec2d773c2f638a35d 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java
@@ -40,7 +40,7 @@ import org.olat.core.commons.modules.bc.FolderRunController;
 import org.olat.core.commons.modules.bc.commands.FolderCommandFactory;
 import org.olat.core.commons.modules.bc.meta.tagged.LockComparator;
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.generic.folder.FolderHelper;
@@ -61,7 +61,7 @@ import org.olat.core.util.vfs.version.Versionable;
  * Initial Date:  Feb 11, 2004
  * @author Mike Stock
  */
-public class FolderComponent extends Component {
+public class FolderComponent extends AbstractComponent {
  	private static final ComponentRenderer RENDERER = new FolderComponentRenderer();
  	
 	public static final String SORT_NAME = "name";
diff --git a/src/main/java/org/olat/core/commons/services/tagging/ui/TagComponent.java b/src/main/java/org/olat/core/commons/services/tagging/ui/TagComponent.java
index 00ce9f26587e6e2bb4b38df560bc5beb7cd96d70..9d55a5534437f8757fc8a6ccc7cf4aa9bfcad493 100644
--- a/src/main/java/org/olat/core/commons/services/tagging/ui/TagComponent.java
+++ b/src/main/java/org/olat/core/commons/services/tagging/ui/TagComponent.java
@@ -25,7 +25,7 @@
 package org.olat.core.commons.services.tagging.ui;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 
 /** 
@@ -35,7 +35,7 @@ import org.olat.core.gui.components.ComponentRenderer;
  * Initial Date:  11.06.2010 <br>
  * @author rhaag
  */
-public class TagComponent extends Component {
+public class TagComponent extends AbstractComponent {
 
 	/**
 	 * @param name
diff --git a/src/main/java/org/olat/core/gui/components/AbstractComponent.java b/src/main/java/org/olat/core/gui/components/AbstractComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..7084de639e973aea40c99ca7c24a7ba2bd5a2fca
--- /dev/null
+++ b/src/main/java/org/olat/core/gui/components/AbstractComponent.java
@@ -0,0 +1,449 @@
+/**
+* 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;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.Event;
+import org.olat.core.gui.render.ValidationResult;
+import org.olat.core.gui.translator.Translator;
+import org.olat.core.logging.AssertException;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.core.logging.activity.ThreadLocalUserActivityLoggerInstaller;
+import org.olat.core.util.CodeHelper;
+
+/**
+ * Description: <br>
+ * 
+ * @author Felix Jost
+ */
+public abstract class AbstractComponent implements Component {
+
+	private static final OLog log_ = Tracing.createLoggerFor(Component.class);
+
+	private boolean spanReplaceable = false;
+
+	private String name;
+	private String dispatchID;
+	private String elementCssClass;
+
+	private long timestamp = 1l;
+	private boolean staticCmp = true;
+	
+	private boolean visible = true;
+	private boolean enabled = true;
+	// true when contents have changed since last rendering
+	private boolean dirty = false;
+	private boolean domReplaceable = true;
+
+	private final List<ComponentEventListener> listeners;
+	private Translator translator;
+	// for debugging reasons to trace where the latest dispatch occured
+	private Controller latestDispatchedController;
+	// for debugging reasons to trace which event was latest fired before an
+	// exception
+	private Event latestFiredEvent;
+	// watch only
+	
+	/**
+	 * do not create a logger for this class otherwise millions of useless loggers are created which consumes
+	 * quite some memory
+	 */
+
+	private Container parent = null;
+	/**
+	 * 
+	 * @param name the name of this component
+	 */
+	public AbstractComponent(String name) {
+		this(null, name, null);
+	}
+	
+	/**
+	 * @param id The id of the component, must be unique
+	 * @param name The name of this component
+	 */
+	public AbstractComponent(String id, String name) {
+		this(id, name, null);
+	}
+
+	/**
+	 * 
+	 * @param name the name of this component
+	 * @param translator the translator
+	 */
+	public AbstractComponent(String name, Translator translator) {
+		this(null, name, translator);
+		staticCmp = false;
+	}
+	
+	/**
+	 * 
+	 * @param id The id of the component, must be unique
+	 * @param name The name of this component
+	 * @param translator The translator
+	 */
+	public AbstractComponent(String id, String name, Translator translator) {
+		if(id == null) {
+			dispatchID = Long.toString(CodeHelper.getRAMUniqueID());
+			staticCmp = false;
+		} else {
+			dispatchID = id;
+			staticCmp = true;
+		}
+		
+		// OO-98: dispatchID will get used in generated js-code. thus, make sure it
+		// is valid as variable name.
+		dispatchID = secureJSVarName(dispatchID);
+					
+		this.name = name;
+		this.translator = translator;
+		listeners = new ArrayList<ComponentEventListener>(2);
+	}
+	
+	/**
+	 * OO-98 : a fix in FormUIFactory changed the id from "null" to
+	 * "something.like.this" for selectionElements (like radio-buttons)
+	 * this led to js-errors because output was:  var o_fisomething.like.this [..]
+	 * now this method ensures that the id does not contain dots 
+	 * 
+	 * @param id
+	 * @return a valid JS variableName
+	 */
+	private static String secureJSVarName(String id) {
+		if(StringUtils.isBlank(id)) return "o_"+Long.toString(CodeHelper.getRAMUniqueID());
+		id = id.replace("-", "_"); // no - 
+		id =  id.replace(".", "_"); // no dots
+		
+		// no numbers at the beginning
+		char c = id.charAt(0);
+        if (c <='/' || c >= ':') {
+        	id = "o"+id;
+        }
+		return id;
+	}
+
+	/**
+	 * @return String
+	 */
+	public String getComponentName() {
+		return name;
+	}
+
+	public String getElementCssClass() {
+		return elementCssClass;
+	}
+
+	public void setElementCssClass(String elementCssClass) {
+		this.elementCssClass = elementCssClass;
+	}
+
+	/**
+	 * @return boolean
+	 */
+	public boolean isVisible() {
+		return visible;
+	}
+
+	/**
+	 * True by default: The component gets rendered<br>
+	 * false: The componet gets not rendered.
+	 * Sets the visible.
+	 * 
+	 * @param visible The visible to set
+	 */
+	public void setVisible(boolean visible) {
+		if(visible ^ this.visible){
+			this.visible = visible;
+			setDirty(true);
+		}
+	}
+
+	public void dispatchRequest(final UserRequest ureq) {
+			doDispatchRequest(ureq);
+	}
+	
+	protected abstract void doDispatchRequest(UserRequest ureq);
+
+	public abstract ComponentRenderer getHTMLRendererSingleton();
+
+	/**
+	 * called just before the rendering of the -whole tree- takes place, so e.g.
+	 * lazy fetching can be implemented, or issueing a request for a new moduleUri
+	 * (e.g. for CPComponent, so that the browser loads images correctly). only
+	 * called when the component is visible
+	 */
+	public void validate(UserRequest ureq, ValidationResult vr) {
+		if (this.dirty) {
+			if(!staticCmp) {
+				timestamp++;
+			}
+			if ( log_.isDebug() ) log_.debug("increment component.timestamp new value=" + timestamp + " ureq=" + ureq + " component=" + this);
+		}
+	}
+	
+	/**
+	 * fires events to registered listeners of generic events.
+	 * To see all events set this class and also AbstractEventBus and DefaultController to debug.
+	 * @param event
+	 * @param ores
+	 */
+	protected void fireEvent(final UserRequest ureq, final Event event) {
+		ComponentEventListener[] listenerArray = new ComponentEventListener[listeners.size()];
+		listeners.toArray(listenerArray);
+		
+		for (ComponentEventListener listenerA:listenerArray) {
+			latestFiredEvent = event;
+			if(listenerA instanceof Controller) {
+				final Controller listener = (Controller)listenerA;
+				latestDispatchedController = listener;
+				try{
+					listener.getUserActivityLogger().frameworkSetBusinessPathFromWindowControl(listener.getWindowControlForDebug());
+				} catch(AssertException e) {
+					log_.error("Error in setting up the businessPath on the IUserActivityLogger. listener="+listener, e);
+					// still continue
+				}
+
+				ThreadLocalUserActivityLoggerInstaller.runWithUserActivityLogger(new Runnable() {
+					public void run() {
+						listener.dispatchEvent(ureq, AbstractComponent.this, event);
+					}
+					
+				}, listener.getUserActivityLogger());
+			} else {
+				listenerA.dispatchEvent(ureq, AbstractComponent.this, event);
+			}
+
+			// clear the event for memory reasons, used only for debugging reasons in
+			// case of an error
+			// TODO:fj: may be useful for admin purposes
+			// FIXME:fj:a rework events so we can get useful info out of it
+			latestFiredEvent = null;
+
+		}
+	}
+
+	/**
+	 * 
+	 * @return a list of the controllers listening (normally only one)
+	 */
+	public List<ComponentEventListener> debuginfoGetListeners() {
+		return listeners;
+	}
+	
+	/**
+	 * @param controller
+	 */
+	public void addListener(ComponentEventListener controller) {
+		// tests if the same controller was already registered to avoid
+		// double-firing.
+		// the contains method is fast since there is normally one one listener
+		// (controller) in the listener list.
+		if (listeners.contains(controller)) throw new AssertException("controller was already added to component '" + getComponentName()
+				+ "', controller was: " + controller.toString());
+		listeners.add(controller);
+	}
+	
+	public void removeListener(ComponentEventListener controller) {
+		listeners.remove(controller);
+	}
+
+	/**
+	 * @return Translator
+	 */
+	public Translator getTranslator() {
+		return translator;
+	}
+
+	/**
+	 * Sets the translator. (for framework internal use)
+	 * 
+	 * @param translator The translator to set
+	 */
+	public void setTranslator(Translator translator) {
+		this.translator = translator;
+	}
+
+	/**
+	 * @return long the dispatchid (which is assigned at construction time of the component and never changes)
+	 */
+	public String getDispatchID() {
+		return dispatchID;
+	}
+
+	/**
+	 * @return the extended debuginfo
+	 */
+	public String getExtendedDebugInfo() {
+		// default impl to be overriden
+		return "n/a";
+	}
+
+	/**
+	 * @return
+	 */
+	public String getListenerInfo() {
+		return "listener:" + listeners.toString();
+	}
+
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return getComponentName() + " " + super.toString();
+	}
+
+	/**
+	 * true by default: The componet gets rendered and actions get dispatched
+	 * if false: e.g. @see Link the link gets rendered but is not clickable
+	 * @return Returns the enabled.
+	 */
+	public boolean isEnabled() {
+		return enabled;
+	}
+
+	/**
+	 * @param enabled The enabled to set.
+	 */
+	public void setEnabled(boolean enabled) {
+		if(enabled ^ this.enabled) {
+			setDirty(true);
+		}
+		this.enabled = enabled;
+	}
+
+	/**
+	 * only for debug purposes!!!
+	 * 
+	 * @return Returns the latestDispatchedController.
+	 */
+	public Controller getLatestDispatchedController() {
+		return latestDispatchedController;
+	}
+
+	/**
+	 * only for debugging reasons!!!
+	 * 
+	 * @return Returns the latestFiredEvent.
+	 */
+	public Event getAndClearLatestFiredEvent() {
+		Event tmp = latestFiredEvent;
+		latestFiredEvent = null; // gc
+		return tmp;
+	}
+
+	/**
+	 * @return returns whether the component needs to be rerendered or not
+	 */
+	public boolean isDirty() {
+		return dirty;
+	}
+	
+	/**
+	 * used by the screenreader feature to determine whether the component has changed from a user's perspective.
+	 * normally this is the same as isDirty(), but may differ, e.g. for a MenuTree (expanding the tree: true; activating a link: false)
+	 * @see org.olat.core.gui.components.tree.MenuTree
+	 * @return whether the component has changed from a user's perspective. 
+	 */
+	public boolean isDirtyForUser() {
+		// default implementation
+		return isDirty();
+	}
+
+	/**
+	 * @param dirty The dirty to set.
+	 */
+	public void setDirty(boolean dirty) {
+		this.dirty = dirty;
+	}
+
+	/**
+	 * @return Returns the domReplaceable.
+	 */
+	public boolean isDomReplaceable() {
+		return domReplaceable;
+	}
+
+	/**
+	 * if set to true(default), then this component can be swapped out in the
+	 * browser dom tree if that capability is enabled
+	 * 
+	 * @param domReplaceable The domReplaceable to set.
+	 */
+	public void setDomReplaceable(boolean domReplaceable) {
+		this.domReplaceable = domReplaceable;
+	}
+	
+	
+	public void setSpanAsDomReplaceable(boolean spanReplaceable){
+		this.spanReplaceable = spanReplaceable;
+	}
+	public boolean getSpanAsDomReplaceable(){
+		return this.spanReplaceable;
+	}
+	
+	/**
+	 * to be called only by the container when a child is added
+	 * @param parent
+	 */
+	public void setParent(Container parent){
+		this.parent = parent;
+	}
+	
+	/**
+	 * @return
+	 */
+	public Container getParent(){
+		return parent;
+	}
+	
+	/**
+	 * Return true if the component is changed without dirty marking. It's a special case which
+	 * for special components which provide a protection against back button usage.
+	 * @return
+	 */
+	public boolean isSilentlyDynamicalCmp() {
+		return false;
+	}
+		
+	/**
+	 * to be used by Window.java to detect browser back in ajax-mode
+	 * @return Returns the timestamp.
+	 */
+	public String getTimestamp() {
+		if(staticCmp) {
+			return "1";
+		}
+		return Long.toString(timestamp);
+	}
+
+}
\ No newline at end of file
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 b0bacf528b7bf462d9126021566d13a86320c77f..c0331d912030f91dbd40e0c9f2bc10a46ee72a90 100644
--- a/src/main/java/org/olat/core/gui/components/Component.java
+++ b/src/main/java/org/olat/core/gui/components/Component.java
@@ -1,450 +1,95 @@
 /**
-* 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;
 
-import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.lang.StringUtils;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.render.ValidationResult;
 import org.olat.core.gui.translator.Translator;
-import org.olat.core.logging.AssertException;
-import org.olat.core.logging.OLog;
-import org.olat.core.logging.Tracing;
-import org.olat.core.logging.activity.ThreadLocalUserActivityLoggerInstaller;
-import org.olat.core.util.CodeHelper;
+
+
 
 /**
- * Description: <br>
  * 
- * @author Felix Jost
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
  */
-public abstract class Component {
-
-	private static final OLog log_ = Tracing.createLoggerFor(Component.class);
-
-	private boolean spanReplaceable = false;
-
-	private String name;
-	private String dispatchID;
-	private String elementCssClass;
-
-	private long timestamp = 1l;
-	private boolean staticCmp = true;
+public interface Component {
 	
-	private boolean visible = true;
-	private boolean enabled = true;
-	// true when contents have changed since last rendering
-	private boolean dirty = false;
-	private boolean domReplaceable = true;
-
-	private final List<ComponentEventListener> listeners;
-	private Translator translator;
-	// for debugging reasons to trace where the latest dispatch occured
-	private Controller latestDispatchedController;
-	// for debugging reasons to trace which event was latest fired before an
-	// exception
-	private Event latestFiredEvent;
-	// watch only
+	public String getComponentName();
 	
-	/**
-	 * do not create a logger for this class otherwise millions of useless loggers are created which consumes
-	 * quite some memory
-	 */
-
-	private Container parent = null;
-	/**
-	 * 
-	 * @param name the name of this component
-	 */
-	public Component(String name) {
-		this(null, name, null);
-	}
+	public String getDispatchID();
+	
+	public String getTimestamp();
 	
-	/**
-	 * @param id The id of the component, must be unique
-	 * @param name The name of this component
-	 */
-	public Component(String id, String name) {
-		this(id, name, null);
-	}
+	public Translator getTranslator();
 
-	/**
-	 * 
-	 * @param name the name of this component
-	 * @param translator the translator
-	 */
-	public Component(String name, Translator translator) {
-		this(null, name, translator);
-		staticCmp = false;
-	}
+	public void setTranslator(Translator translator);
 	
-	/**
-	 * 
-	 * @param id The id of the component, must be unique
-	 * @param name The name of this component
-	 * @param translator The translator
-	 */
-	public Component(String id, String name, Translator translator) {
-		if(id == null) {
-			dispatchID = Long.toString(CodeHelper.getRAMUniqueID());
-			staticCmp = false;
-		} else {
-			dispatchID = id;
-			staticCmp = true;
-		}
-		
-		// OO-98: dispatchID will get used in generated js-code. thus, make sure it
-		// is valid as variable name.
-		dispatchID = secureJSVarName(dispatchID);
-					
-		this.name = name;
-		this.translator = translator;
-		listeners = new ArrayList<ComponentEventListener>(2);
-	}
+	public ComponentRenderer getHTMLRendererSingleton();
 	
-	/**
-	 * OO-98 : a fix in FormUIFactory changed the id from "null" to
-	 * "something.like.this" for selectionElements (like radio-buttons)
-	 * this led to js-errors because output was:  var o_fisomething.like.this [..]
-	 * now this method ensures that the id does not contain dots 
-	 * 
-	 * @param id
-	 * @return a valid JS variableName
-	 */
-	private static String secureJSVarName(String id) {
-		if(StringUtils.isBlank(id)) return "o_"+Long.toString(CodeHelper.getRAMUniqueID());
-		id = id.replace("-", "_"); // no - 
-		id =  id.replace(".", "_"); // no dots
-		
-		// no numbers at the beginning
-		char c = id.charAt(0);
-        if (c <='/' || c >= ':') {
-        	id = "o"+id;
-        }
-		return id;
-	}
-
-	/**
-	 * @return String
-	 */
-	public String getComponentName() {
-		return name;
-	}
-
-	public String getElementCssClass() {
-		return elementCssClass;
-	}
-
-	public void setElementCssClass(String elementCssClass) {
-		this.elementCssClass = elementCssClass;
-	}
-
-	/**
-	 * @return boolean
-	 */
-	public boolean isVisible() {
-		return visible;
-	}
-
-	/**
-	 * True by default: The component gets rendered<br>
-	 * false: The componet gets not rendered.
-	 * Sets the visible.
-	 * 
-	 * @param visible The visible to set
-	 */
-	public void setVisible(boolean visible) {
-		if(visible ^ this.visible){
-			this.visible = visible;
-			setDirty(true);
-		}
-	}
-
-	public void dispatchRequest(final UserRequest ureq) {
-			doDispatchRequest(ureq);
-	}
+	public boolean isEnabled();
 	
-	protected abstract void doDispatchRequest(UserRequest ureq);
-
-	public abstract ComponentRenderer getHTMLRendererSingleton();
-
-	/**
-	 * called just before the rendering of the -whole tree- takes place, so e.g.
-	 * lazy fetching can be implemented, or issueing a request for a new moduleUri
-	 * (e.g. for CPComponent, so that the browser loads images correctly). only
-	 * called when the component is visible
-	 */
-	public void validate(UserRequest ureq, ValidationResult vr) {
-		if (this.dirty) {
-			if(!staticCmp) {
-				timestamp++;
-			}
-			if ( log_.isDebug() ) log_.debug("increment component.timestamp new value=" + timestamp + " ureq=" + ureq + " component=" + this);
-		}
-	}
+	public void setEnabled(boolean enabled);
 	
-	/**
-	 * fires events to registered listeners of generic events.
-	 * To see all events set this class and also AbstractEventBus and DefaultController to debug.
-	 * @param event
-	 * @param ores
-	 */
-	protected void fireEvent(final UserRequest ureq, final Event event) {
-		ComponentEventListener[] listenerArray = new ComponentEventListener[listeners.size()];
-		listeners.toArray(listenerArray);
-		
-		for (ComponentEventListener listenerA:listenerArray) {
-			latestFiredEvent = event;
-			if(listenerA instanceof Controller) {
-				final Controller listener = (Controller)listenerA;
-				latestDispatchedController = listener;
-				try{
-					listener.getUserActivityLogger().frameworkSetBusinessPathFromWindowControl(listener.getWindowControlForDebug());
-				} catch(AssertException e) {
-					log_.error("Error in setting up the businessPath on the IUserActivityLogger. listener="+listener, e);
-					// still continue
-				}
-
-				ThreadLocalUserActivityLoggerInstaller.runWithUserActivityLogger(new Runnable() {
-					public void run() {
-						listener.dispatchEvent(ureq, Component.this, event);
-					}
-					
-				}, listener.getUserActivityLogger());
-			} else {
-				listenerA.dispatchEvent(ureq, Component.this, event);
-			}
-
-			// clear the event for memory reasons, used only for debugging reasons in
-			// case of an error
-			// TODO:fj: may be useful for admin purposes
-			// FIXME:fj:a rework events so we can get useful info out of it
-			latestFiredEvent = null;
-
-		}
-	}
-
-	/**
-	 * 
-	 * @return a list of the controllers listening (normally only one)
-	 */
-	public List<ComponentEventListener> debuginfoGetListeners() {
-		return listeners;
-	}
+	public boolean isVisible();
 	
-	/**
-	 * @param controller
-	 */
-	public void addListener(ComponentEventListener controller) {
-		// tests if the same controller was already registered to avoid
-		// double-firing.
-		// the contains method is fast since there is normally one one listener
-		// (controller) in the listener list.
-		if (listeners.contains(controller)) throw new AssertException("controller was already added to component '" + getComponentName()
-				+ "', controller was: " + controller.toString());
-		listeners.add(controller);
-	}
+	public void setVisible(boolean visible);
 	
-	public void removeListener(ComponentEventListener controller) {
-		listeners.remove(controller);
-	}
-
-	/**
-	 * @return Translator
-	 */
-	public Translator getTranslator() {
-		return translator;
-	}
-
-	/**
-	 * Sets the translator. (for framework internal use)
-	 * 
-	 * @param translator The translator to set
-	 */
-	public void setTranslator(Translator translator) {
-		this.translator = translator;
-	}
-
-	/**
-	 * @return long the dispatchid (which is assigned at construction time of the component and never changes)
-	 */
-	public String getDispatchID() {
-		return dispatchID;
-	}
-
-	/**
-	 * @return the extended debuginfo
-	 */
-	public String getExtendedDebugInfo() {
-		// default impl to be overriden
-		return "n/a";
-	}
-
-	/**
-	 * @return
-	 */
-	public String getListenerInfo() {
-		return "listener:" + listeners.toString();
-	}
-
-	/**
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return getComponentName() + " " + super.toString();
-	}
-
-	/**
-	 * true by default: The componet gets rendered and actions get dispatched
-	 * if false: e.g. @see Link the link gets rendered but is not clickable
-	 * @return Returns the enabled.
-	 */
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	/**
-	 * @param enabled The enabled to set.
-	 */
-	public void setEnabled(boolean enabled) {
-		if(enabled ^ this.enabled) {
-			setDirty(true);
-		}
-		this.enabled = enabled;
-	}
-
-	/**
-	 * only for debug purposes!!!
-	 * 
-	 * @return Returns the latestDispatchedController.
-	 */
-	public Controller getLatestDispatchedController() {
-		return latestDispatchedController;
-	}
-
-	/**
-	 * only for debugging reasons!!!
-	 * 
-	 * @return Returns the latestFiredEvent.
-	 */
-	public Event getAndClearLatestFiredEvent() {
-		Event tmp = latestFiredEvent;
-		latestFiredEvent = null; // gc
-		return tmp;
-	}
-
-	/**
-	 * @return returns whether the component needs to be rerendered or not
-	 */
-	public boolean isDirty() {
-		return dirty;
-	}
+	public boolean isDirty();
 	
-	/**
-	 * used by the screenreader feature to determine whether the component has changed from a user's perspective.
-	 * normally this is the same as isDirty(), but may differ, e.g. for a MenuTree (expanding the tree: true; activating a link: false)
-	 * @see org.olat.core.gui.components.tree.MenuTree
-	 * @return whether the component has changed from a user's perspective. 
-	 */
-	public boolean isDirtyForUser() {
-		// default implementation
-		return isDirty();
-	}
-
-	/**
-	 * @param dirty The dirty to set.
-	 */
-	public void setDirty(boolean dirty) {
-		this.dirty = dirty;
-	}
-
-	/**
-	 * @return Returns the domReplaceable.
-	 */
-	public boolean isDomReplaceable() {
-		return domReplaceable;
-	}
+	public boolean isDirtyForUser();
+	
+	public void setDirty(boolean dirty);
+	
+	public boolean isDomReplaceable();
+	
+	public void setDomReplaceable(boolean domReplaceable);
+	
+	public boolean getSpanAsDomReplaceable();
 
-	/**
-	 * if set to true(default), then this component can be swapped out in the
-	 * browser dom tree if that capability is enabled
-	 * 
-	 * @param domReplaceable The domReplaceable to set.
-	 */
-	public void setDomReplaceable(boolean domReplaceable) {
-		this.domReplaceable = domReplaceable;
-	}
+	public void setSpanAsDomReplaceable(boolean spanReplaceable);
+	
+	public boolean isSilentlyDynamicalCmp();
+	
+	public Container getParent();
+	
+	public void setParent(Container parent);
+	
+	public void addListener(ComponentEventListener controller);
+	
+	public List<ComponentEventListener> debuginfoGetListeners();
+	
+	public void dispatchRequest(UserRequest ureq);
 	
+	public void validate(UserRequest ureq, ValidationResult vr);
 	
-	public void setSpanAsDomReplaceable(boolean spanReplaceable){
-		this.spanReplaceable = spanReplaceable;
-	}
-	public boolean getSpanAsDomReplaceable(){
-		return this.spanReplaceable;
-	}
+	public String getListenerInfo();
 	
-	/**
-	 * to be called only by the container when a child is added
-	 * @param parent
-	 * @deprecated
-	 */
-	void setParent(Container parent){
-		this.parent = parent;
-	}
+	public String getExtendedDebugInfo();
 	
-	/**
-	 * @return
-	 */
-	public Container getParent(){
-		return parent;
-	}
+	public Controller getLatestDispatchedController();
 	
-	/**
-	 * Return true if the component is changed without dirty marking. It's a special case which
-	 * for special components which provide a protection against back button usage.
-	 * @return
-	 */
-	public boolean isSilentlyDynamicalCmp() {
-		return false;
-	}
-		
-	/**
-	 * to be used by Window.java to detect browser back in ajax-mode
-	 * @return Returns the timestamp.
-	 */
-	public String getTimestamp() {
-		if(staticCmp) {
-			return "1";
-		}
-		return Long.toString(timestamp);
-	}
+	public Event getAndClearLatestFiredEvent();
 
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/gui/components/Container.java b/src/main/java/org/olat/core/gui/components/Container.java
index 790bd4735724191ac4e0aa77fbb324da38dc0c48..70b794d1c0c7ae503709d2d3072aa88299fc2adb 100644
--- a/src/main/java/org/olat/core/gui/components/Container.java
+++ b/src/main/java/org/olat/core/gui/components/Container.java
@@ -36,7 +36,7 @@ import org.olat.core.gui.translator.Translator;
  * 
  * @author Felix Jost
  */
-public abstract class Container extends Component implements ComponentCollection {
+public abstract class Container extends AbstractComponent implements ComponentCollection {
 	private Map<String, Component> components = new HashMap<String, Component>(5);
 
 	/**
diff --git a/src/main/java/org/olat/core/gui/components/chart/AbstractD3Component.java b/src/main/java/org/olat/core/gui/components/chart/AbstractD3Component.java
index 334ccdef93caf920498eeb5107c7f479523e7ef2..3e1e6c184d1951d1758bd23bed985edc718ec6d0 100644
--- a/src/main/java/org/olat/core/gui/components/chart/AbstractD3Component.java
+++ b/src/main/java/org/olat/core/gui/components/chart/AbstractD3Component.java
@@ -20,7 +20,7 @@
 package org.olat.core.gui.components.chart;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.render.ValidationResult;
 
@@ -31,7 +31,7 @@ import org.olat.core.gui.render.ValidationResult;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-public abstract class AbstractD3Component extends Component {
+public abstract class AbstractD3Component extends AbstractComponent {
 	
 	public AbstractD3Component(String name) {
 		super(name);
diff --git a/src/main/java/org/olat/core/gui/components/choice/Choice.java b/src/main/java/org/olat/core/gui/components/choice/Choice.java
index 2bff2b30ebdcd9e50d818cadf23051ff004dd939..70f455ed407baf708dafd95aea59a06ba620c937 100644
--- a/src/main/java/org/olat/core/gui/components/choice/Choice.java
+++ b/src/main/java/org/olat/core/gui/components/choice/Choice.java
@@ -30,7 +30,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.components.table.Table;
 import org.olat.core.gui.components.table.TableDataModel;
@@ -43,7 +43,7 @@ import org.olat.core.util.Util;
  * 
  * @author Felix Jost
  */
-public class Choice extends Component {
+public class Choice extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new ChoiceRenderer();
 
 	/**
diff --git a/src/main/java/org/olat/core/gui/components/date/DateComponent.java b/src/main/java/org/olat/core/gui/components/date/DateComponent.java
index fcd72a3dab0f177b5536069de26bc6379ce8b30d..cb3e460bab6af96e2290cc9a8a16bec2dc3e54fa 100644
--- a/src/main/java/org/olat/core/gui/components/date/DateComponent.java
+++ b/src/main/java/org/olat/core/gui/components/date/DateComponent.java
@@ -22,7 +22,7 @@ package org.olat.core.gui.components.date;
 import java.util.Date;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 
 /**
@@ -34,7 +34,7 @@ import org.olat.core.gui.components.ComponentRenderer;
  * 
  * @author gnaegi
  */
-public class DateComponent extends Component {
+public class DateComponent extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new DateComponentRenderer();
 	private Date date;
 	private boolean showYear;
diff --git a/src/main/java/org/olat/core/gui/components/delegating/DelegatingComponent.java b/src/main/java/org/olat/core/gui/components/delegating/DelegatingComponent.java
index 5555d4ea5eda65123717080e12140f0fdd2cd15c..df13fc26be6922425570bbf35126d16d8fe34136 100644
--- a/src/main/java/org/olat/core/gui/components/delegating/DelegatingComponent.java
+++ b/src/main/java/org/olat/core/gui/components/delegating/DelegatingComponent.java
@@ -27,7 +27,7 @@
 package org.olat.core.gui.components.delegating;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.control.Event;
 
@@ -39,7 +39,7 @@ import org.olat.core.gui.control.Event;
  * 
  * @author Felix Jost
  */
-public class DelegatingComponent extends Component {
+public class DelegatingComponent extends AbstractComponent {
 	/**
 	 * Comment for <code>FORWARDED</code> : the only event fired by this
 	 * component
diff --git a/src/main/java/org/olat/core/gui/components/download/DisplayOrDownloadComponent.java b/src/main/java/org/olat/core/gui/components/download/DisplayOrDownloadComponent.java
index ef251fc29ec93b80718827ecd150b271b1916431..338187a475d5d7d0b3adac31ae9c2180a258e749 100644
--- a/src/main/java/org/olat/core/gui/components/download/DisplayOrDownloadComponent.java
+++ b/src/main/java/org/olat/core/gui/components/download/DisplayOrDownloadComponent.java
@@ -20,7 +20,7 @@
 package org.olat.core.gui.components.download;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 
 /**
@@ -41,7 +41,7 @@ import org.olat.core.gui.components.ComponentRenderer;
  * 
  * @author gnaegi
  */
-public class DisplayOrDownloadComponent extends Component {
+public class DisplayOrDownloadComponent extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new DisplayOrDownloadComponentRenderer();
 	private String fileUrl = null;
 
diff --git a/src/main/java/org/olat/core/gui/components/download/DownloadComponent.java b/src/main/java/org/olat/core/gui/components/download/DownloadComponent.java
index 0020bf3d9870ae26946acf5bb6cfcc87a3f202be..2d8f89d7bb0b9c7c5496e61aac7574bfe7791f5b 100644
--- a/src/main/java/org/olat/core/gui/components/download/DownloadComponent.java
+++ b/src/main/java/org/olat/core/gui/components/download/DownloadComponent.java
@@ -20,7 +20,7 @@
 package org.olat.core.gui.components.download;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.media.MediaResource;
 import org.olat.core.util.vfs.VFSLeaf;
@@ -36,7 +36,7 @@ import org.olat.core.util.vfs.VFSMediaResource;
  * 
  * @author gnaegi
  */
-public class DownloadComponent extends Component {
+public class DownloadComponent extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new DownloadComponentRenderer();
 	private MediaResource mediaResource;
 	private String linkText;
diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java
index cb437377f34682106572b960f6256b9813c03ce6..732eafa5e673829e3cf0f0f722828b8a5aa8ba4f 100644
--- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java
+++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/FormBaseComponentImpl.java
@@ -27,7 +27,7 @@ package org.olat.core.gui.components.form.flexible.impl;
 
 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.AbstractComponent;
 import org.olat.core.gui.components.form.flexible.FormBaseComponentIdProvider;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.logging.AssertException;
@@ -41,7 +41,7 @@ import org.olat.core.logging.AssertException;
  * Initial Date:  11.01.2007 <br>
  * @author patrickb
  */
-public abstract class FormBaseComponentImpl extends Component implements FormBaseComponentIdProvider{	
+public abstract class FormBaseComponentImpl extends AbstractComponent implements FormBaseComponentIdProvider{	
 
 	public FormBaseComponentImpl(String name) {
 		super(name);
diff --git a/src/main/java/org/olat/core/gui/components/htmlheader/HtmlHeaderComponent.java b/src/main/java/org/olat/core/gui/components/htmlheader/HtmlHeaderComponent.java
index f234f6ee7f80a716df6da61a013d34f75c31178d..cb88d40a107d5f03beba5be9d0c1b1c561daa454 100644
--- a/src/main/java/org/olat/core/gui/components/htmlheader/HtmlHeaderComponent.java
+++ b/src/main/java/org/olat/core/gui/components/htmlheader/HtmlHeaderComponent.java
@@ -27,7 +27,7 @@
 package org.olat.core.gui.components.htmlheader;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 
 /**
@@ -35,7 +35,7 @@ import org.olat.core.gui.components.ComponentRenderer;
  * 
  * @author gnaegi
  */
-public class HtmlHeaderComponent extends Component {
+public class HtmlHeaderComponent extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new HtmlHeaderRenderer();
 
 	private String jsBodyOnLoad;
diff --git a/src/main/java/org/olat/core/gui/components/htmlheader/jscss/CustomJSComponent.java b/src/main/java/org/olat/core/gui/components/htmlheader/jscss/CustomJSComponent.java
index ca0dc1ffb7a0a036cc125d333f2ead94748e0632..bb50c47dfdeb413f2ec41f499c3603db92f4f8c0 100644
--- a/src/main/java/org/olat/core/gui/components/htmlheader/jscss/CustomJSComponent.java
+++ b/src/main/java/org/olat/core/gui/components/htmlheader/jscss/CustomJSComponent.java
@@ -20,7 +20,7 @@
 package org.olat.core.gui.components.htmlheader.jscss;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.control.JSAndCSSAdder;
 import org.olat.core.gui.render.ValidationResult;
@@ -44,7 +44,7 @@ import org.olat.core.gui.render.ValidationResult;
  * 
  * @author strentini, sergio.trentini@frentix.com, www.frentix.com
  */
-public class CustomJSComponent extends Component {
+public class CustomJSComponent extends AbstractComponent {
 
 	private final String[] jsFilePaths;
 
diff --git a/src/main/java/org/olat/core/gui/components/htmlheader/jscss/JSAndCSSComponent.java b/src/main/java/org/olat/core/gui/components/htmlheader/jscss/JSAndCSSComponent.java
index 30964ce9cd73f7e296e0e1f5fc95cc9b6cd91661..9cce3fc7756d6a8de36fa3f089dccbc336d9f9c2 100644
--- a/src/main/java/org/olat/core/gui/components/htmlheader/jscss/JSAndCSSComponent.java
+++ b/src/main/java/org/olat/core/gui/components/htmlheader/jscss/JSAndCSSComponent.java
@@ -34,7 +34,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.control.JSAndCSSAdder;
 import org.olat.core.gui.render.ValidationResult;
@@ -49,7 +49,7 @@ import org.olat.core.gui.render.ValidationResult;
 *
 * @author Felix Jost
 */
-public class JSAndCSSComponent extends Component {
+public class JSAndCSSComponent extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new JSAndCSSComponentRenderer();
 	private final String cssFileName;
 	private final String[] jsFileNames;
diff --git a/src/main/java/org/olat/core/gui/components/htmlsite/HtmlStaticPageComponent.java b/src/main/java/org/olat/core/gui/components/htmlsite/HtmlStaticPageComponent.java
index 2b02afb9aea1b7fa6ac0138474a23dcf5e11aa4c..8e923d046a1cef9fe6b858f0152001b6886c057b 100644
--- a/src/main/java/org/olat/core/gui/components/htmlsite/HtmlStaticPageComponent.java
+++ b/src/main/java/org/olat/core/gui/components/htmlsite/HtmlStaticPageComponent.java
@@ -30,7 +30,7 @@ import org.olat.core.CoreSpringFactory;
 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.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.media.AsyncMediaResponsible;
 import org.olat.core.gui.media.MediaResource;
@@ -51,7 +51,7 @@ import org.olat.core.util.vfs.VFSMediaResource;
  * 
  * @author Felix Jost
  */
-public class HtmlStaticPageComponent extends Component implements AsyncMediaResponsible {
+public class HtmlStaticPageComponent extends AbstractComponent implements AsyncMediaResponsible {
 	// make public mainly for the IFrameDisplayController
 	public static final String OLAT_CMD_PREFIX = "olatcmd/";
 
diff --git a/src/main/java/org/olat/core/gui/components/image/ImageComponent.java b/src/main/java/org/olat/core/gui/components/image/ImageComponent.java
index 06ba60dad2306fb3fb3e1df1575f7009b4bb3262..5f72e399c5913571f3e3dd7d03b2eea62cece5fa 100644
--- a/src/main/java/org/olat/core/gui/components/image/ImageComponent.java
+++ b/src/main/java/org/olat/core/gui/components/image/ImageComponent.java
@@ -38,7 +38,7 @@ import javax.imageio.stream.MemoryCacheImageInputStream;
 
 import org.apache.commons.io.IOUtils;
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.media.MediaResource;
 import org.olat.core.logging.AssertException;
@@ -52,7 +52,7 @@ import org.olat.core.util.image.Size;
  * 
  * @author Felix Jost
  */
-public class ImageComponent extends Component {
+public class ImageComponent extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new ImageRenderer();
 	private static final OLog log = Tracing.createLoggerFor(ImageComponent.class);
 	
diff --git a/src/main/java/org/olat/core/gui/components/link/Link.java b/src/main/java/org/olat/core/gui/components/link/Link.java
index 0f27671d73166f63527da8f0ce746e683c49502d..94794b6d0b591283f18ea45ddaa1ee77079348af 100644
--- a/src/main/java/org/olat/core/gui/components/link/Link.java
+++ b/src/main/java/org/olat/core/gui/components/link/Link.java
@@ -27,7 +27,7 @@
 package org.olat.core.gui.components.link;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Controller;
@@ -44,7 +44,7 @@ import org.olat.core.logging.Tracing;
  * 
  * @author Alexander Schneider, Patrick Brunner
  */
-public class Link extends Component {
+public class Link extends AbstractComponent {
 	private static final OLog log = Tracing.createLoggerFor(Link.class);
 	//single renderer for all users, lazy creation upon first object creation of this class.
 	private static final ComponentRenderer RENDERER = new LinkRenderer();
diff --git a/src/main/java/org/olat/core/gui/components/progressbar/ProgressBar.java b/src/main/java/org/olat/core/gui/components/progressbar/ProgressBar.java
index fb814a00f2919e46f53cdbba510bfc7a9f6e615c..f2371179832c92ca6a23fd1b3b016611bbc23c3b 100644
--- a/src/main/java/org/olat/core/gui/components/progressbar/ProgressBar.java
+++ b/src/main/java/org/olat/core/gui/components/progressbar/ProgressBar.java
@@ -27,7 +27,7 @@
 package org.olat.core.gui.components.progressbar;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 
 /**
@@ -35,7 +35,7 @@ import org.olat.core.gui.components.ComponentRenderer;
  * 
  * @author Andreas
  */
-public class ProgressBar extends Component {
+public class ProgressBar extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new ProgressBarRenderer();
 
 	private static final int DEFAULT_WIDTH = 200;
diff --git a/src/main/java/org/olat/core/gui/components/rating/RatingComponent.java b/src/main/java/org/olat/core/gui/components/rating/RatingComponent.java
index 736e388c22c8ff98eec6de3452c784efd84d14e1..923e997f0be328ed6476b8c6e3f7ac46283e4826 100644
--- a/src/main/java/org/olat/core/gui/components/rating/RatingComponent.java
+++ b/src/main/java/org/olat/core/gui/components/rating/RatingComponent.java
@@ -23,7 +23,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.components.form.flexible.impl.Form;
 import org.olat.core.gui.components.velocity.VelocityContainer;
@@ -44,7 +44,7 @@ import org.olat.core.logging.Tracing;
  * Initial Date:  31.10.2008 <br>
  * @author gnaegi
  */
-public class RatingComponent extends Component {
+public class RatingComponent extends AbstractComponent {
 	private static final OLog log = Tracing.createLoggerFor(RatingComponent.class);
 	private static final ComponentRenderer RENDERER = new RatingRenderer();
 	private List<String> ratingLabels;
diff --git a/src/main/java/org/olat/core/gui/components/rating/RatingWithAverageComponent.java b/src/main/java/org/olat/core/gui/components/rating/RatingWithAverageComponent.java
index 9dc03b88acb9aa9342f4fc9c6e752912b3699c5c..8296614478e5fd9ac518458ceade7304b0eb214f 100644
--- a/src/main/java/org/olat/core/gui/components/rating/RatingWithAverageComponent.java
+++ b/src/main/java/org/olat/core/gui/components/rating/RatingWithAverageComponent.java
@@ -20,6 +20,7 @@
 package org.olat.core.gui.components.rating;
 
 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.ComponentEventListener;
 import org.olat.core.gui.components.ComponentRenderer;
@@ -31,7 +32,7 @@ import org.olat.core.gui.control.Event;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-public class RatingWithAverageComponent extends Component implements ComponentEventListener {
+public class RatingWithAverageComponent extends AbstractComponent implements ComponentEventListener {
 	
 	private static final RatingWithAverageRenderer RENDERER = new RatingWithAverageRenderer();
 	
diff --git a/src/main/java/org/olat/core/gui/components/segmentedview/SegmentViewComponent.java b/src/main/java/org/olat/core/gui/components/segmentedview/SegmentViewComponent.java
index 8aeb8100536f5b54747d8e7b2ecc0022595829af..7de6ac4c7f2fa3cc1b2ac56a2792798d676895ee 100644
--- a/src/main/java/org/olat/core/gui/components/segmentedview/SegmentViewComponent.java
+++ b/src/main/java/org/olat/core/gui/components/segmentedview/SegmentViewComponent.java
@@ -26,13 +26,14 @@ import java.util.List;
 import java.util.Set;
 
 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.ComponentRenderer;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.components.velocity.VelocityContainer;
 import org.olat.core.gui.control.Event;
 
-public class SegmentViewComponent extends Component  {
+public class SegmentViewComponent extends AbstractComponent  {
 	
 	private boolean allowNoSelection;
 	private boolean allowMultipleSelection;
diff --git a/src/main/java/org/olat/core/gui/components/table/Table.java b/src/main/java/org/olat/core/gui/components/table/Table.java
index ee8ea5423eba8d2d82a5964b77e75e3439001a41..694749bf82be002ab79128504e7a20c517e2d884 100644
--- a/src/main/java/org/olat/core/gui/components/table/Table.java
+++ b/src/main/java/org/olat/core/gui/components/table/Table.java
@@ -33,7 +33,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.render.StringOutput;
@@ -53,7 +53,7 @@ import org.olat.core.util.filter.FilterFactory;
  * 
  * @author Felix Jost
  */
-public class Table extends Component {
+public class Table extends AbstractComponent {
 	private static final int NO_ROW_SELECTED = -1;
 	private static final int DEFAULT_RESULTS_PER_PAGE = 20;
 	private static final int INITIAL_COLUMNSIZE = 5;
diff --git a/src/main/java/org/olat/core/gui/components/text/TextComponent.java b/src/main/java/org/olat/core/gui/components/text/TextComponent.java
index ab6dab9693642e2a48f983aee23ccfd701dc7f5b..7ad8bf16e5b03c152ce0d489390e9f15067f95b3 100644
--- a/src/main/java/org/olat/core/gui/components/text/TextComponent.java
+++ b/src/main/java/org/olat/core/gui/components/text/TextComponent.java
@@ -20,7 +20,7 @@
 package org.olat.core.gui.components.text;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.logging.AssertException;
@@ -39,7 +39,7 @@ import org.olat.core.logging.AssertException;
  * 
  * @author gnaegi
  */
-public class TextComponent extends Component {
+public class TextComponent extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new TextComponentRenderer();
 	private String text; // a plain vanilla string, will not be translated
 	private String i18nKey; // a i18n key that will be translated with
diff --git a/src/main/java/org/olat/core/gui/components/tree/MenuTree.java b/src/main/java/org/olat/core/gui/components/tree/MenuTree.java
index c0397505cd3bf8686895b5a3692bd318f9a45c31..fbd7593aec1c3a0b6bda7b6e4b97b10393731fed 100644
--- a/src/main/java/org/olat/core/gui/components/tree/MenuTree.java
+++ b/src/main/java/org/olat/core/gui/components/tree/MenuTree.java
@@ -35,7 +35,7 @@ import java.util.Set;
 
 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.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.util.StringHelper;
@@ -47,7 +47,7 @@ import org.olat.core.util.tree.TreeHelper;
  * 
  * @author Felix Jost
  */
-public class MenuTree extends Component {
+public class MenuTree extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new MenuTreeRenderer();
 
 	/**
diff --git a/src/main/java/org/olat/core/gui/components/tree/SelectionTree.java b/src/main/java/org/olat/core/gui/components/tree/SelectionTree.java
index 679c77b1f740ed92d1b906bdd1dadd7e29f8c5e6..6a0e7516e531ef294a5626358e8234843b1bbe62 100644
--- a/src/main/java/org/olat/core/gui/components/tree/SelectionTree.java
+++ b/src/main/java/org/olat/core/gui/components/tree/SelectionTree.java
@@ -32,7 +32,7 @@ import java.util.List;
 
 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.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.components.form.Form;
 import org.olat.core.gui.translator.PackageTranslator;
@@ -47,7 +47,7 @@ import org.olat.core.util.tree.TreeHelper;
  * 
  * @author Felix Jost
  */
-public class SelectionTree extends Component {
+public class SelectionTree extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new SelectionTreeRenderer();	
 	private static final String PACKAGE = Util.getPackageName(SelectionTree.class);
 	
diff --git a/src/main/java/org/olat/core/gui/components/util/UserLoggedInCounter.java b/src/main/java/org/olat/core/gui/components/util/UserLoggedInCounter.java
index 930419dcc3c8d53d87b4aff4c527ff4322d5891a..26de130e2085011c7c1d8809beb5f077d10d579e 100644
--- a/src/main/java/org/olat/core/gui/components/util/UserLoggedInCounter.java
+++ b/src/main/java/org/olat/core/gui/components/util/UserLoggedInCounter.java
@@ -23,7 +23,7 @@ package org.olat.core.gui.components.util;
 
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.util.session.UserSessionManager;
 
@@ -37,7 +37,7 @@ import org.olat.core.util.session.UserSessionManager;
  * @author Florian Gnaegi, frentix GmbH, http://www.frentix.com
  */
 
-public class UserLoggedInCounter extends Component {
+public class UserLoggedInCounter extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new UserLoggedInCounterRenderer();
 	private int currentCount = 0;
 
diff --git a/src/main/java/org/olat/core/gui/components/util/ValidateForwardComponent.java b/src/main/java/org/olat/core/gui/components/util/ValidateForwardComponent.java
index 44674dfddd9150a85c5150a575b067d3b270a7d0..41c5fb2adc1bbf03091f0e3a2a17c928b87e42a1 100644
--- a/src/main/java/org/olat/core/gui/components/util/ValidateForwardComponent.java
+++ b/src/main/java/org/olat/core/gui/components/util/ValidateForwardComponent.java
@@ -26,7 +26,7 @@
 package org.olat.core.gui.components.util;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.render.RenderUtil;
 import org.olat.core.gui.render.ValidationResult;
@@ -48,7 +48,7 @@ import org.olat.core.gui.translator.Translator;
  * Initial Date: 10.03.2007 <br>
  * @author Felix Jost, http://www.goodsolutions.ch
  */
-public class ValidateForwardComponent extends Component {
+public class ValidateForwardComponent extends AbstractComponent {
 
 	/**
 	 * @param name
diff --git a/src/main/java/org/olat/modules/iq/IQComponent.java b/src/main/java/org/olat/modules/iq/IQComponent.java
index 5124657cf4b4e23a83f36c7c546c46629aa12625..3189afb9d76e3d36183f36ddbc1853edd542ee0b 100644
--- a/src/main/java/org/olat/modules/iq/IQComponent.java
+++ b/src/main/java/org/olat/modules/iq/IQComponent.java
@@ -26,7 +26,7 @@
 package org.olat.modules.iq;
 
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.translator.Translator;
@@ -37,7 +37,7 @@ import org.olat.ims.qti.process.AssessmentInstance;
  *
  * @author Mike Stock
  */
-public class IQComponent extends Component {
+public class IQComponent extends AbstractComponent {
 	private static final ComponentRenderer RENDERER = new IQComponentRenderer();
 
 	private AssessmentInstance ai;
diff --git a/src/main/java/org/olat/modules/tu/TunnelComponent.java b/src/main/java/org/olat/modules/tu/TunnelComponent.java
index 29da91689c441ee194ddeb1d09bee746f153b75e..9ed59c82430a62709797131bbaafe948a3d000be 100644
--- a/src/main/java/org/olat/modules/tu/TunnelComponent.java
+++ b/src/main/java/org/olat/modules/tu/TunnelComponent.java
@@ -45,7 +45,7 @@ import org.apache.http.util.EntityUtils;
 import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
-import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.media.AsyncMediaResponsible;
 import org.olat.core.gui.media.HttpRequestMediaResource;
@@ -64,7 +64,7 @@ import org.olat.modules.ModuleConfiguration;
 /**
  * @author Mike Stock Comment:
  */
-public class TunnelComponent extends Component implements AsyncMediaResponsible {
+public class TunnelComponent extends AbstractComponent implements AsyncMediaResponsible {
 	private static final OLog log = Tracing.createLoggerFor(TunnelComponent.class);
 	private static final ComponentRenderer RENDERER = new TunnelRenderer();
 
diff --git a/src/main/java/org/olat/modules/wiki/gui/components/wikiToHtml/WikiMarkupComponent.java b/src/main/java/org/olat/modules/wiki/gui/components/wikiToHtml/WikiMarkupComponent.java
index 662f85cd0f68fec3166ed02582b5a16ac2cd0ea1..ee65b6dda433d1e6572236e30da73c0017e30c1b 100644
--- a/src/main/java/org/olat/modules/wiki/gui/components/wikiToHtml/WikiMarkupComponent.java
+++ b/src/main/java/org/olat/modules/wiki/gui/components/wikiToHtml/WikiMarkupComponent.java
@@ -37,7 +37,7 @@ import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 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.AbstractComponent;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.control.Disposable;
 import org.olat.core.gui.control.JSAndCSSAdder;
@@ -59,7 +59,7 @@ import org.olat.modules.wiki.WikiPage;
  * 
  * @author guido
  */
-public class WikiMarkupComponent extends Component implements Disposable {
+public class WikiMarkupComponent extends AbstractComponent implements Disposable {
 	// single renderer for all users, lazy creation upon first object cration of
 	// this class.
 	private static final ComponentRenderer RENDERER = new WikiMarkupRenderer();