You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/03/07 09:39:03 UTC

[3/19] WICKET-4439 Move classes around so that there are no two packages with the same name in different modules

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/IRequestListener.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/IRequestListener.java b/wicket-core/src/main/java/org/apache/wicket/IRequestListener.java
index 7763085..0837273 100644
--- a/wicket-core/src/main/java/org/apache/wicket/IRequestListener.java
+++ b/wicket-core/src/main/java/org/apache/wicket/IRequestListener.java
@@ -17,6 +17,8 @@
 package org.apache.wicket;
 
 
+import org.apache.wicket.util.io.IClusterable;
+
 /**
  * Base interface for all interfaces that listen for requests from the client browser. All
  * sub-interfaces of this interface must have a single method which takes no arguments.

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/Localizer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Localizer.java b/wicket-core/src/main/java/org/apache/wicket/Localizer.java
index d70216e..b6d9bf2 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Localizer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Localizer.java
@@ -31,7 +31,7 @@ import org.apache.wicket.resource.loader.IStringResourceLoader;
 import org.apache.wicket.settings.IResourceSettings;
 import org.apache.wicket.util.lang.Generics;
 import org.apache.wicket.util.string.AppendingStringBuffer;
-import org.apache.wicket.util.string.interpolator.PropertyVariableInterpolator;
+import org.apache.wicket.core.util.string.interpolator.PropertyVariableInterpolator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
index d005e15..9727ba6 100644
--- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
@@ -40,10 +40,11 @@ import org.apache.wicket.model.IComponentInheritedModel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.IWrapModel;
 import org.apache.wicket.settings.IDebugSettings;
+import org.apache.wicket.util.io.IClusterable;
 import org.apache.wicket.util.iterator.ComponentHierarchyIterator;
 import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.lang.Generics;
-import org.apache.wicket.util.string.ComponentStrings;
+import org.apache.wicket.core.util.string.ComponentStrings;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.visit.ClassVisitFilter;
 import org.apache.wicket.util.visit.IVisit;

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/MetaDataEntry.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/MetaDataEntry.java b/wicket-core/src/main/java/org/apache/wicket/MetaDataEntry.java
index 145f643..6847a0d 100644
--- a/wicket-core/src/main/java/org/apache/wicket/MetaDataEntry.java
+++ b/wicket-core/src/main/java/org/apache/wicket/MetaDataEntry.java
@@ -17,6 +17,8 @@
 package org.apache.wicket;
 
 
+import org.apache.wicket.util.io.IClusterable;
+
 /**
  * Class used for holding meta data entries.
  * 

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/MetaDataKey.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/MetaDataKey.java b/wicket-core/src/main/java/org/apache/wicket/MetaDataKey.java
index 33d3e8a..64bb616 100644
--- a/wicket-core/src/main/java/org/apache/wicket/MetaDataKey.java
+++ b/wicket-core/src/main/java/org/apache/wicket/MetaDataKey.java
@@ -17,6 +17,8 @@
 package org.apache.wicket;
 
 
+import org.apache.wicket.util.io.IClusterable;
+
 /**
  * A key to a piece of metadata associated with a {@link Component}, {@link Session} or
  * {@link Application} at runtime. The key contains type information that can be used to check the

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/Page.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Page.java b/wicket-core/src/main/java/org/apache/wicket/Page.java
index 849088b..e739e87 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Page.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Page.java
@@ -38,7 +38,7 @@ import org.apache.wicket.settings.IDebugSettings;
 import org.apache.wicket.settings.IPageSettings;
 import org.apache.wicket.settings.IRequestCycleSettings.RenderStrategy;
 import org.apache.wicket.util.lang.Generics;
-import org.apache.wicket.util.lang.WicketObjects;
+import org.apache.wicket.core.util.lang.WicketObjects;
 import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.visit.IVisit;
 import org.apache.wicket.util.visit.IVisitor;

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/PageReference.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/PageReference.java b/wicket-core/src/main/java/org/apache/wicket/PageReference.java
index 1e8208e..9a035df 100644
--- a/wicket-core/src/main/java/org/apache/wicket/PageReference.java
+++ b/wicket-core/src/main/java/org/apache/wicket/PageReference.java
@@ -17,6 +17,8 @@
 package org.apache.wicket;
 
 
+import org.apache.wicket.util.io.IClusterable;
+
 /**
  * Unique identifier of a page instance
  * 
@@ -31,9 +33,7 @@ public class PageReference implements IClusterable
 	/**
 	 * Constructor
 	 * 
-	 * @param pageMapName
 	 * @param pageId
-	 * @param version
 	 */
 	PageReference(int pageId)
 	{

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java b/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java
index 940c15b..a3c67bd 100644
--- a/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java
+++ b/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java
@@ -27,7 +27,7 @@ import org.apache.wicket.authorization.AuthorizationException;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.request.RequestHandlerStack.ReplaceHandlerException;
 import org.apache.wicket.request.component.IRequestableComponent;
-import org.apache.wicket.request.handler.ListenerInvocationNotAllowedException;
+import org.apache.wicket.core.request.handler.ListenerInvocationNotAllowedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/RestartResponseAtInterceptPageException.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/RestartResponseAtInterceptPageException.java b/wicket-core/src/main/java/org/apache/wicket/RestartResponseAtInterceptPageException.java
index 6c425c0..1fbd4b6 100644
--- a/wicket-core/src/main/java/org/apache/wicket/RestartResponseAtInterceptPageException.java
+++ b/wicket-core/src/main/java/org/apache/wicket/RestartResponseAtInterceptPageException.java
@@ -31,9 +31,9 @@ import org.apache.wicket.request.Url;
 import org.apache.wicket.request.Url.QueryParameter;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.flow.ResetResponseException;
-import org.apache.wicket.request.handler.PageProvider;
-import org.apache.wicket.request.handler.RenderPageRequestHandler;
-import org.apache.wicket.request.handler.RenderPageRequestHandler.RedirectPolicy;
+import org.apache.wicket.core.request.handler.PageProvider;
+import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
+import org.apache.wicket.core.request.handler.RenderPageRequestHandler.RedirectPolicy;
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.http.handler.RedirectRequestHandler;
 import org.apache.wicket.request.mapper.parameter.PageParameters;

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/RestartResponseException.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/RestartResponseException.java b/wicket-core/src/main/java/org/apache/wicket/RestartResponseException.java
index 406900b..c991124 100644
--- a/wicket-core/src/main/java/org/apache/wicket/RestartResponseException.java
+++ b/wicket-core/src/main/java/org/apache/wicket/RestartResponseException.java
@@ -18,10 +18,10 @@ package org.apache.wicket;
 
 import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.request.flow.ResetResponseException;
-import org.apache.wicket.request.handler.IPageProvider;
-import org.apache.wicket.request.handler.PageProvider;
-import org.apache.wicket.request.handler.RenderPageRequestHandler;
-import org.apache.wicket.request.handler.RenderPageRequestHandler.RedirectPolicy;
+import org.apache.wicket.core.request.handler.IPageProvider;
+import org.apache.wicket.core.request.handler.PageProvider;
+import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
+import org.apache.wicket.core.request.handler.RenderPageRequestHandler.RedirectPolicy;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/Session.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Session.java b/wicket-core/src/main/java/org/apache/wicket/Session.java
index 5ae3e0e..c679d45 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Session.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Session.java
@@ -26,21 +26,22 @@ import java.util.Map;
 
 import org.apache.wicket.application.IClassResolver;
 import org.apache.wicket.authorization.IAuthorizationStrategy;
+import org.apache.wicket.core.request.ClientInfo;
+import org.apache.wicket.core.util.lang.WicketObjects;
 import org.apache.wicket.event.IEvent;
 import org.apache.wicket.event.IEventSink;
 import org.apache.wicket.feedback.FeedbackMessage;
 import org.apache.wicket.feedback.FeedbackMessages;
 import org.apache.wicket.page.IPageManager;
 import org.apache.wicket.page.PageAccessSynchronizer;
-import org.apache.wicket.request.ClientInfo;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.session.ISessionStore;
 import org.apache.wicket.settings.IApplicationSettings;
+import org.apache.wicket.util.io.IClusterable;
 import org.apache.wicket.util.IProvider;
 import org.apache.wicket.util.LazyInitializer;
 import org.apache.wicket.util.lang.Objects;
-import org.apache.wicket.util.lang.WicketObjects;
 import org.apache.wicket.util.tester.BaseWicketTester;
 import org.apache.wicket.util.time.Duration;
 import org.slf4j.Logger;

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/SystemMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/SystemMapper.java b/wicket-core/src/main/java/org/apache/wicket/SystemMapper.java
index 712dd33..7883435 100644
--- a/wicket-core/src/main/java/org/apache/wicket/SystemMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/SystemMapper.java
@@ -17,12 +17,12 @@
 package org.apache.wicket;
 
 import org.apache.wicket.request.component.IRequestablePage;
-import org.apache.wicket.request.mapper.BookmarkableMapper;
-import org.apache.wicket.request.mapper.BufferedResponseMapper;
+import org.apache.wicket.core.request.mapper.BookmarkableMapper;
+import org.apache.wicket.core.request.mapper.BufferedResponseMapper;
 import org.apache.wicket.request.mapper.CompoundRequestMapper;
-import org.apache.wicket.request.mapper.HomePageMapper;
-import org.apache.wicket.request.mapper.PageInstanceMapper;
-import org.apache.wicket.request.mapper.ResourceReferenceMapper;
+import org.apache.wicket.core.request.mapper.HomePageMapper;
+import org.apache.wicket.core.request.mapper.PageInstanceMapper;
+import org.apache.wicket.core.request.mapper.ResourceReferenceMapper;
 import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
 import org.apache.wicket.request.resource.caching.IResourceCachingStrategy;
 import org.apache.wicket.util.ClassProvider;

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java
index ef127e9..a7c3e0a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AbstractAjaxTimerBehavior.java
@@ -17,11 +17,8 @@
 package org.apache.wicket.ajax;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.ajax.json.JSONException;
-import org.apache.wicket.ajax.json.JSONObject;
-import org.apache.wicket.markup.head.OnLoadHeaderItem;
 import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.markup.head.OnLoadHeaderItem;
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.util.time.Duration;
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxChannel.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxChannel.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxChannel.java
index a22b81d..55f79c1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxChannel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxChannel.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.ajax;
 
-import org.apache.wicket.IClusterable;
+import org.apache.wicket.util.io.IClusterable;
 import org.apache.wicket.util.lang.Args;
 
 /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
index b9dffa9..a226ca7 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestHandler.java
@@ -28,6 +28,9 @@ import org.apache.wicket.Application;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Page;
+import org.apache.wicket.core.request.handler.PageProvider;
+import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
+import org.apache.wicket.core.request.handler.logger.PageLogData;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.request.IRequestCycle;
@@ -35,9 +38,6 @@ import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.Response;
 import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.request.handler.PageProvider;
-import org.apache.wicket.request.handler.RenderPageRequestHandler;
-import org.apache.wicket.request.handler.logger.PageLogData;
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.http.WebResponse;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
@@ -175,7 +175,7 @@ public class AjaxRequestHandler implements AjaxRequestTarget
 	}
 
 	/**
-	 * @see org.apache.wicket.request.handler.IPageRequestHandler#getPage()
+	 * @see org.apache.wicket.core.request.handler.IPageRequestHandler#getPage()
 	 */
 	@Override
 	public Page getPage()
@@ -266,7 +266,7 @@ public class AjaxRequestHandler implements AjaxRequestTarget
 	}
 
 	/**
-	 * @see org.apache.wicket.request.handler.IPageRequestHandler#detach(org.apache.wicket.request.IRequestCycle)
+	 * @see org.apache.wicket.core.request.handler.IPageRequestHandler#detach(org.apache.wicket.request.IRequestCycle)
 	 */
 	@Override
 	public void detach(final IRequestCycle requestCycle)
@@ -318,7 +318,7 @@ public class AjaxRequestHandler implements AjaxRequestTarget
 	}
 
 	/**
-	 * @see org.apache.wicket.request.handler.IPageRequestHandler#respond(org.apache.wicket.request.IRequestCycle)
+	 * @see org.apache.wicket.core.request.handler.IPageRequestHandler#respond(org.apache.wicket.request.IRequestCycle)
 	 */
 	@Override
 	public final void respond(final IRequestCycle requestCycle)
@@ -423,7 +423,7 @@ public class AjaxRequestHandler implements AjaxRequestTarget
 	}
 
 	/**
-	 * @see org.apache.wicket.request.handler.IPageRequestHandler#getPageClass()
+	 * @see org.apache.wicket.core.request.handler.IPageRequestHandler#getPageClass()
 	 */
 	@Override
 	public Class<? extends IRequestablePage> getPageClass()
@@ -432,7 +432,7 @@ public class AjaxRequestHandler implements AjaxRequestTarget
 	}
 
 	/**
-	 * @see org.apache.wicket.request.handler.IPageRequestHandler#getPageId()
+	 * @see org.apache.wicket.core.request.handler.IPageRequestHandler#getPageId()
 	 */
 	@Override
 	public Integer getPageId()
@@ -441,7 +441,7 @@ public class AjaxRequestHandler implements AjaxRequestTarget
 	}
 
 	/**
-	 * @see org.apache.wicket.request.handler.IPageRequestHandler#getPageParameters()
+	 * @see org.apache.wicket.core.request.handler.IPageRequestHandler#getPageParameters()
 	 */
 	@Override
 	public PageParameters getPageParameters()

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
index 0ad5b51..47de47f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxRequestTarget.java
@@ -24,7 +24,7 @@ import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Page;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.request.ILoggableRequestHandler;
-import org.apache.wicket.request.handler.IPageRequestHandler;
+import org.apache.wicket.core.request.handler.IPageRequestHandler;
 
 /**
  *

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java
index c34c0be..d15e653 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/AjaxRequestAttributes.java
@@ -16,14 +16,14 @@
  */
 package org.apache.wicket.ajax.attributes;
 
-import org.apache.wicket.ajax.AjaxChannel;
-import org.apache.wicket.util.lang.Args;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.wicket.ajax.AjaxChannel;
+import org.apache.wicket.util.lang.Args;
+
 /**
  * Attributes of an Ajax Request.
  * 

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/IAjaxCallListener.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/IAjaxCallListener.java b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/IAjaxCallListener.java
index 06c086e..7750715 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/IAjaxCallListener.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/IAjaxCallListener.java
@@ -17,7 +17,7 @@
 package org.apache.wicket.ajax.attributes;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.IClusterable;
+import org.apache.wicket.util.io.IClusterable;
 
 /**
  * Interface used to listen at the most important points when Wicket performs an Ajax callback.

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/JavaScriptFunctionBody.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/JavaScriptFunctionBody.java b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/JavaScriptFunctionBody.java
index 908677b..4e7fcc4 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/JavaScriptFunctionBody.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/JavaScriptFunctionBody.java
@@ -17,7 +17,7 @@
 package org.apache.wicket.ajax.attributes;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.IClusterable;
+import org.apache.wicket.util.io.IClusterable;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.html.IComponentAwareHeaderContributor;
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/ThrottlingSettings.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/ThrottlingSettings.java b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/ThrottlingSettings.java
index 4610dd9..0893d86 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/ThrottlingSettings.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/attributes/ThrottlingSettings.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.ajax.attributes;
 
-import org.apache.wicket.IClusterable;
+import org.apache.wicket.util.io.IClusterable;
 import org.apache.wicket.util.time.Duration;
 
 /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormValidatingBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormValidatingBehavior.java b/wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormValidatingBehavior.java
index cb04abf..4f4c034 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormValidatingBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormValidatingBehavior.java
@@ -17,13 +17,13 @@
 package org.apache.wicket.ajax.form;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.IClusterable;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
 import org.apache.wicket.ajax.attributes.ThrottlingSettings;
 import org.apache.wicket.feedback.IFeedback;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.FormComponent;
+import org.apache.wicket.util.io.IClusterable;
 import org.apache.wicket.util.time.Duration;
 import org.apache.wicket.util.visit.IVisit;
 import org.apache.wicket.util.visit.IVisitor;

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/application/HeaderContributorListenerCollection.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/application/HeaderContributorListenerCollection.java b/wicket-core/src/main/java/org/apache/wicket/application/HeaderContributorListenerCollection.java
index e3567b0..6a3a976 100644
--- a/wicket-core/src/main/java/org/apache/wicket/application/HeaderContributorListenerCollection.java
+++ b/wicket-core/src/main/java/org/apache/wicket/application/HeaderContributorListenerCollection.java
@@ -16,8 +16,8 @@
  */
 package org.apache.wicket.application;
 
-import org.apache.wicket.markup.html.IHeaderContributor;
 import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.html.IHeaderContributor;
 import org.apache.wicket.util.listener.ListenerCollection;
 
 /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/authorization/UnauthorizedInstantiationException.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/authorization/UnauthorizedInstantiationException.java b/wicket-core/src/main/java/org/apache/wicket/authorization/UnauthorizedInstantiationException.java
index ff9ca2a..8e76aef 100644
--- a/wicket-core/src/main/java/org/apache/wicket/authorization/UnauthorizedInstantiationException.java
+++ b/wicket-core/src/main/java/org/apache/wicket/authorization/UnauthorizedInstantiationException.java
@@ -17,7 +17,7 @@
 package org.apache.wicket.authorization;
 
 import org.apache.wicket.request.component.IRequestableComponent;
-import org.apache.wicket.util.lang.WicketObjects;
+import org.apache.wicket.core.util.lang.WicketObjects;
 
 /**
  * Exception that is thrown when the creation of a component is not allowed.

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/authorization/strategies/action/IActionAuthorizer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/authorization/strategies/action/IActionAuthorizer.java b/wicket-core/src/main/java/org/apache/wicket/authorization/strategies/action/IActionAuthorizer.java
index 3a06e57..5896c8b 100644
--- a/wicket-core/src/main/java/org/apache/wicket/authorization/strategies/action/IActionAuthorizer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/authorization/strategies/action/IActionAuthorizer.java
@@ -17,8 +17,8 @@
 package org.apache.wicket.authorization.strategies.action;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.IClusterable;
 import org.apache.wicket.authorization.Action;
+import org.apache.wicket.util.io.IClusterable;
 
 /**
  * A way to provide authorization for a specific component action.

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java b/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java
index d483bf3..22115f1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/behavior/Behavior.java
@@ -20,12 +20,12 @@ import java.lang.reflect.Method;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.Component;
-import org.apache.wicket.IClusterable;
 import org.apache.wicket.IComponentAwareEventSink;
 import org.apache.wicket.event.IEvent;
 import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.markup.html.IComponentAwareHeaderContributor;
 import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.html.IComponentAwareHeaderContributor;
+import org.apache.wicket.util.io.IClusterable;
 
 /**
  * Behaviors are kind of plug-ins for Components. They allow functionality to be added to a

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/ClientInfo.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/ClientInfo.java b/wicket-core/src/main/java/org/apache/wicket/core/request/ClientInfo.java
new file mode 100644
index 0000000..8de9b0f
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/ClientInfo.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request;
+
+import org.apache.wicket.util.io.IClusterable;
+
+/**
+ * Encapsulates information about the request cycle agents' capabilities.
+ * 
+ * @author Eelco Hillenius
+ */
+public abstract class ClientInfo implements IClusterable
+{
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Construct.
+	 */
+	public ClientInfo()
+	{
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BookmarkableListenerInterfaceRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BookmarkableListenerInterfaceRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BookmarkableListenerInterfaceRequestHandler.java
new file mode 100644
index 0000000..a669fd2
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BookmarkableListenerInterfaceRequestHandler.java
@@ -0,0 +1,184 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.RequestListenerInterface;
+import org.apache.wicket.request.IRequestCycle;
+import org.apache.wicket.request.component.IRequestableComponent;
+import org.apache.wicket.request.component.IRequestablePage;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.lang.Args;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Request handler for bookmarkable pages with listener interface. This handler is only used to
+ * generate URLs. Rendering is always handled by {@link ListenerInterfaceRequestHandler}.
+ * 
+ * @author Matej Knopp
+ */
+public class BookmarkableListenerInterfaceRequestHandler
+	implements
+		IPageRequestHandler,
+		IComponentRequestHandler
+{
+	private static final Logger logger = LoggerFactory.getLogger(BookmarkableListenerInterfaceRequestHandler.class);
+
+	private final IPageAndComponentProvider pageComponentProvider;
+
+	private final RequestListenerInterface listenerInterface;
+
+	private final Integer behaviorIndex;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param pageComponentProvider
+	 * @param listenerInterface
+	 * @param behaviorIndex
+	 */
+	public BookmarkableListenerInterfaceRequestHandler(
+		IPageAndComponentProvider pageComponentProvider,
+		RequestListenerInterface listenerInterface, Integer behaviorIndex)
+	{
+		Args.notNull(pageComponentProvider, "pageComponentProvider");
+		Args.notNull(listenerInterface, "listenerInterface");
+
+		this.pageComponentProvider = pageComponentProvider;
+		this.listenerInterface = listenerInterface;
+		this.behaviorIndex = behaviorIndex;
+	}
+
+	/**
+	 * Construct.
+	 * 
+	 * @param pageComponentProvider
+	 * @param component
+	 * @param listenerInterface
+	 */
+	public BookmarkableListenerInterfaceRequestHandler(
+		PageAndComponentProvider pageComponentProvider, RequestListenerInterface listenerInterface)
+	{
+		this(pageComponentProvider, listenerInterface, null);
+	}
+
+	/**
+	 * @see org.apache.wicket.request.handler.IComponentRequestHandler#getComponent()
+	 */
+	@Override
+	public IRequestableComponent getComponent()
+	{
+		return pageComponentProvider.getComponent();
+	}
+
+	@Override
+	public final String getComponentPath()
+	{
+		return pageComponentProvider.getComponentPath();
+	}
+
+	/**
+	 * @see org.apache.wicket.request.handler.IPageRequestHandler#getPage()
+	 */
+	@Override
+	public IRequestablePage getPage()
+	{
+		return pageComponentProvider.getPageInstance();
+	}
+
+	/**
+	 * @see org.apache.wicket.request.handler.IPageClassRequestHandler#getPageClass()
+	 */
+	@Override
+	public Class<? extends IRequestablePage> getPageClass()
+	{
+		return pageComponentProvider.getPageClass();
+	}
+
+	/**
+	 * @see org.apache.wicket.request.handler.IPageRequestHandler#getPageId()
+	 */
+	@Override
+	public Integer getPageId()
+	{
+		return pageComponentProvider.getPageId();
+	}
+
+	/**
+	 * @see org.apache.wicket.request.handler.IPageClassRequestHandler#getPageParameters()
+	 */
+	@Override
+	public PageParameters getPageParameters()
+	{
+		return pageComponentProvider.getPageParameters();
+	}
+
+	/**
+	 * @see org.apache.org.apache.wicket.request.IRequestHandler#detach(org.apache.wicket.request.cycle.RequestCycle)
+	 */
+	@Override
+	public void detach(IRequestCycle requestCycle)
+	{
+		pageComponentProvider.detach();
+	}
+
+	/**
+	 * Returns the listener interface.
+	 * 
+	 * @return listener interface
+	 */
+	public RequestListenerInterface getListenerInterface()
+	{
+		return listenerInterface;
+	}
+
+	/**
+	 * Returns index of behavior this listener is targeted on or <code>null</code> if component is
+	 * the target
+	 * 
+	 * @return behavior index or <code>null</code>
+	 */
+	public Integer getBehaviorIndex()
+	{
+		return behaviorIndex;
+	}
+
+	/**
+	 * @see org.apache.org.apache.wicket.request.IRequestHandler#respond(org.apache.wicket.request.cycle.RequestCycle)
+	 */
+	@Override
+	public void respond(IRequestCycle requestCycle)
+	{
+		// nothing to do here, this handler is only used to generate URLs
+	}
+
+	@Override
+	public final boolean isPageInstanceCreated()
+	{
+		// this request handler always operates on a created page instance
+		return true;
+	}
+
+	/**
+	 * @return the render count of the page
+	 */
+	@Override
+	public final Integer getRenderCount()
+	{
+		return pageComponentProvider.getRenderCount();
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BookmarkablePageRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BookmarkablePageRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BookmarkablePageRequestHandler.java
new file mode 100644
index 0000000..6dbc915
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BookmarkablePageRequestHandler.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.core.request.handler.logger.PageLogData;
+import org.apache.wicket.request.ILoggableRequestHandler;
+import org.apache.wicket.request.IRequestCycle;
+import org.apache.wicket.request.component.IRequestablePage;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * Request handler for bookmarkable pages. This handler is only used to generate URLs. Rendering is
+ * always handled by {@link RenderPageRequestHandler}.
+ * 
+ * @author Matej Knopp
+ */
+public class BookmarkablePageRequestHandler
+	implements
+		IPageClassRequestHandler,
+		ILoggableRequestHandler
+{
+	private final IPageProvider pageProvider;
+
+	private PageLogData logData;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param pageProvider
+	 */
+	public BookmarkablePageRequestHandler(IPageProvider pageProvider)
+	{
+
+		Args.notNull(pageProvider, "pageProvider");
+
+		this.pageProvider = pageProvider;
+	}
+
+	/**
+	 * @see IPageClassRequestHandler#getPageClass()
+	 */
+	@Override
+	public Class<? extends IRequestablePage> getPageClass()
+	{
+		return pageProvider.getPageClass();
+	}
+
+	/**
+	 * @see IPageClassRequestHandler#getPageParameters()
+	 */
+	@Override
+	public PageParameters getPageParameters()
+	{
+		return pageProvider.getPageParameters();
+	}
+
+	/**
+	 * @see org.apache.wicket.request.IRequestHandler#respond(org.apache.wicket.request.IRequestCycle)
+	 */
+	@Override
+	public void respond(IRequestCycle requestCycle)
+	{
+		// not used as BookmarkablePageRequestHandler is only used when generating URLs.
+		// However URL will never be resolved to BookmarkablePageRequestHandler
+	}
+
+	/**
+	 * @see org.apache.wicket.request.IRequestHandler#detach(org.apache.wicket.request.IRequestCycle)
+	 */
+	@Override
+	public void detach(IRequestCycle requestCycle)
+	{
+		if (logData == null)
+			logData = new PageLogData(pageProvider);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public PageLogData getLogData()
+	{
+		return logData;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BufferedResponseRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BufferedResponseRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BufferedResponseRequestHandler.java
new file mode 100644
index 0000000..6271953
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/BufferedResponseRequestHandler.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.protocol.http.BufferedWebResponse;
+import org.apache.wicket.request.IRequestCycle;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.http.WebResponse;
+
+/**
+ * Handler that renders a {@link BufferedWebResponse}.
+ * 
+ * @author Matej Knopp
+ */
+public class BufferedResponseRequestHandler implements IRequestHandler
+{
+	private final BufferedWebResponse bufferedWebResponse;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param bufferedWebResponse
+	 */
+	public BufferedResponseRequestHandler(BufferedWebResponse bufferedWebResponse)
+	{
+		this.bufferedWebResponse = bufferedWebResponse;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void detach(IRequestCycle requestCycle)
+	{
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void respond(IRequestCycle requestCycle)
+	{
+		bufferedWebResponse.writeTo((WebResponse)requestCycle.getResponse());
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ComponentNotFoundException.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ComponentNotFoundException.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ComponentNotFoundException.java
new file mode 100644
index 0000000..b6cec50
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ComponentNotFoundException.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.WicketRuntimeException;
+
+/**
+ * Exception thrown when component has not been found in hierarchy.
+ * 
+ * @author Matej Knopp
+ */
+public class ComponentNotFoundException extends WicketRuntimeException
+{
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Construct.
+	 */
+	public ComponentNotFoundException()
+	{
+	}
+
+	/**
+	 * Construct.
+	 * 
+	 * @param message
+	 */
+	public ComponentNotFoundException(String message)
+	{
+		super(message);
+	}
+
+	/**
+	 * Construct.
+	 * 
+	 * @param message
+	 * @param cause
+	 */
+	public ComponentNotFoundException(String message, Throwable cause)
+	{
+		super(message, cause);
+	}
+
+	/**
+	 * Construct.
+	 * 
+	 * @param cause
+	 */
+	public ComponentNotFoundException(Throwable cause)
+	{
+		super(cause);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ComponentRenderingRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ComponentRenderingRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ComponentRenderingRequestHandler.java
new file mode 100644
index 0000000..16d9708
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ComponentRenderingRequestHandler.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.request.IRequestCycle;
+import org.apache.wicket.request.component.IRequestableComponent;
+import org.apache.wicket.request.http.WebResponse;
+
+/**
+ * Request handler that renders a component
+ * 
+ * @author igor.vaynberg
+ */
+public class ComponentRenderingRequestHandler implements IComponentRequestHandler
+{
+	private final Component component;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param component
+	 */
+	public ComponentRenderingRequestHandler(Component component)
+	{
+		this.component = component;
+	}
+
+	@Override
+	public IRequestableComponent getComponent()
+	{
+		return component;
+	}
+
+	@Override
+	public void detach(IRequestCycle requestCycle)
+	{
+		component.getPage().detach();
+	}
+
+	@Override
+	public void respond(IRequestCycle requestCycle)
+	{
+		// preventing the response to component from being cached
+		if (requestCycle.getResponse() instanceof WebResponse)
+		{
+			WebResponse response = (WebResponse)requestCycle.getResponse();
+			response.disableCaching();
+		}
+		component.render();
+	}
+
+	@Override
+	public final String getComponentPath()
+	{
+		return component.getPageRelativePath();
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/EmptyAjaxRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/EmptyAjaxRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/EmptyAjaxRequestHandler.java
new file mode 100644
index 0000000..0cefb76
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/EmptyAjaxRequestHandler.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.request.IRequestCycle;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.http.WebResponse;
+
+/**
+ * The empty AJAX request target does output an empty AJAX response.
+ * <br/>
+ * May be used as a light, "do nothing" Ajax response.
+ * 
+ * @author Matej Knopp
+ */
+public final class EmptyAjaxRequestHandler implements IRequestHandler
+{
+	/** immutable hashcode. */
+	private static final int HASH = 17 * 1542323;
+
+	/** singleton instance. */
+	private static final EmptyAjaxRequestHandler instance = new EmptyAjaxRequestHandler();
+
+	/**
+	 * Construct.
+	 */
+	private EmptyAjaxRequestHandler()
+	{
+	}
+
+	/**
+	 * Gets the singleton instance.
+	 * 
+	 * @return the singleton instance
+	 */
+	public static final EmptyAjaxRequestHandler getInstance()
+	{
+		return instance;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void respond(IRequestCycle requestCycle)
+	{
+		WebResponse response = (WebResponse)requestCycle.getResponse();
+		final String encoding = Application.get()
+			.getRequestCycleSettings()
+			.getResponseRequestEncoding();
+
+		// Set content type based on markup type for page
+		response.setContentType("text/xml; charset=" + encoding);
+
+		// Make sure it is not cached by a client
+		response.disableCaching();
+
+		response.write("<?xml version=\"1.0\" encoding=\"");
+		response.write(encoding);
+		response.write("\"?><ajax-response></ajax-response>");
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void detach(IRequestCycle requestCycle)
+	{
+	}
+
+	/**
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	@Override
+	public boolean equals(Object obj)
+	{
+		return obj instanceof EmptyAjaxRequestHandler;
+	}
+
+	/**
+	 * @see java.lang.Object#hashCode()
+	 */
+	@Override
+	public int hashCode()
+	{
+		return HASH;
+	}
+
+	/**
+	 * @see java.lang.Object#toString()
+	 */
+	@Override
+	public String toString()
+	{
+		return "EmptyAjaxRequestTarget";
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IComponentRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IComponentRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IComponentRequestHandler.java
new file mode 100644
index 0000000..6a9a60f
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IComponentRequestHandler.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.component.IRequestableComponent;
+
+/**
+ * Request handler that works with a component.
+ * 
+ * @author Matej Knopp
+ */
+public interface IComponentRequestHandler extends IRequestHandler
+{
+	/**
+	 * Returns the component instance.
+	 * 
+	 * @return component instance
+	 */
+	IRequestableComponent getComponent();
+
+	/**
+	 * Returns the page relative path to the component instance.
+	 * 
+	 * @return the page relative path to the component instance
+	 */
+	String getComponentPath();
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageAndComponentProvider.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageAndComponentProvider.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageAndComponentProvider.java
new file mode 100644
index 0000000..85b84a8
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageAndComponentProvider.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.request.component.IRequestableComponent;
+
+/**
+ * Extension of {@link IPageProvider} that is also capable of providing a Component belonging to the
+ * page.
+ * 
+ * @author Matej Knopp
+ */
+public interface IPageAndComponentProvider extends IPageProvider
+{
+	/**
+	 * Returns component on specified page with given path.
+	 * 
+	 * @return component
+	 */
+	IRequestableComponent getComponent();
+
+	/**
+	 * Returns the page relative component path.
+	 * 
+	 * @return the page relative component path.
+	 */
+	String getComponentPath();
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageClassRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageClassRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageClassRequestHandler.java
new file mode 100644
index 0000000..f6f169e
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageClassRequestHandler.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.component.IRequestablePage;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+/**
+ * Request handler that works with page class.
+ * 
+ * @author Matej Knopp
+ */
+public interface IPageClassRequestHandler extends IRequestHandler
+{
+	/**
+	 * Returns the page class
+	 * 
+	 * @return page class
+	 */
+	Class<? extends IRequestablePage> getPageClass();
+
+	/**
+	 * @return page parameters
+	 */
+	PageParameters getPageParameters();
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageProvider.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageProvider.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageProvider.java
new file mode 100644
index 0000000..43d3886
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageProvider.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.core.request.mapper.StalePageException;
+import org.apache.wicket.request.component.IRequestablePage;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+
+/**
+ * Represents object capable of providing a page instance. In some cases the implementation class
+ * might now page class and page parameters without having the actual page instance. Thus it's
+ * recommended to call {@link #getPageParameters()} instead of calling {@link #getPageInstance()}
+ * .getPageParameters(). Same goes for page class.
+ * 
+ * @author Matej Knopp
+ */
+public interface IPageProvider
+{
+	/**
+	 * Returns page instance specified by the constructor.
+	 * 
+	 * @return page instance
+	 * @throws StalePageException
+	 *             if render count has been specified in constructor and the render count of page
+	 *             does not match the value
+	 * @throws {@link PageExpiredException} if the specified page could not have been found and the
+	 *         constructor used did not provide enough information to create new page instance
+	 */
+	IRequestablePage getPageInstance();
+
+	/**
+	 * Returns {@link PageParameters} of the page.
+	 * 
+	 * @return page parameters
+	 */
+	PageParameters getPageParameters();
+
+	/**
+	 * Returns whether calling getPageInstance() will result in creating new page instance or
+	 * whether it will be an existing instance (even though it might be pulled from page store).
+	 * 
+	 * @return <code>true</code> if calling {@link #getPageInstance()} will create new page
+	 *         instance, <code>false</code> otherwise.
+	 */
+	boolean isNewPageInstance();
+
+	/**
+	 * Returns class of the page.
+	 * 
+	 * @return page class
+	 */
+	Class<? extends IRequestablePage> getPageClass();
+
+	/**
+	 * Returns the page id.
+	 * 
+	 * @return page id
+	 */
+	Integer getPageId();
+
+	/**
+	 * Returns the number of times this page has been rendered.
+	 * 
+	 * @return the number of times this page has been rendered.
+	 */
+	Integer getRenderCount();
+
+	/**
+	 * Detaches the page if it has been loaded.
+	 */
+	void detach();
+
+	/**
+	 * Checks whether or not the provider has a page instance. This page instance might have been
+	 * passed to this page provider directly or it may have been instantiated or retrieved from the
+	 * page store.
+	 * 
+	 * @return {@code true} iff page instance has been created or retrieved
+	 */
+	public boolean hasPageInstance();
+
+	/**
+	 * Returns whether or not the page instance held by this provider has been instantiated by the
+	 * provider.
+	 * 
+	 * @throws IllegalStateException
+	 *             if this method is called and the provider does not yet have a page instance, ie
+	 *             if {@link #getPageInstance()} has never been called on this provider
+	 * @return {@code true} iff the page instance held by this provider was instantiated by the
+	 *         provider
+	 */
+	public boolean isPageInstanceFresh();
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageRequestHandler.java
new file mode 100644
index 0000000..963ba7f
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/IPageRequestHandler.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.request.component.IRequestablePage;
+
+/**
+ * Request handler that works with a page instance.
+ * 
+ * @author Matej Knopp
+ */
+public interface IPageRequestHandler extends IPageClassRequestHandler
+{
+	/**
+	 * Returns the page. Be aware that the page can be instantiated if this wasn't the case already.
+	 * 
+	 * @return page instance
+	 */
+	IRequestablePage getPage();
+
+	/**
+	 * Returns the page id.
+	 * 
+	 * @return page id
+	 */
+	Integer getPageId();
+
+	/**
+	 * Checks if the page instance is already created or if it will be created when
+	 * {@link #getPage()} is called
+	 * 
+	 * @return {@code true} iff page instance is not yet created
+	 */
+	boolean isPageInstanceCreated();
+
+	/**
+	 * Returns the number of times this page has been rendered.
+	 * 
+	 * @return the number of times this page has been rendered.
+	 * @see IRequestablePage#getRenderCount()
+	 */
+	Integer getRenderCount();
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java
new file mode 100644
index 0000000..31f99a0
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInterfaceRequestHandler.java
@@ -0,0 +1,281 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.RequestListenerInterface;
+import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.core.request.handler.RenderPageRequestHandler.RedirectPolicy;
+import org.apache.wicket.core.request.handler.logger.ListenerInterfaceLogData;
+import org.apache.wicket.request.ILoggableRequestHandler;
+import org.apache.wicket.request.IRequestCycle;
+import org.apache.wicket.request.component.IRequestableComponent;
+import org.apache.wicket.request.component.IRequestablePage;
+import org.apache.wicket.request.http.WebRequest;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.lang.Args;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Request handler that invokes the listener interface on component and renders page afterwards.
+ * 
+ * @author Matej Knopp
+ */
+public class ListenerInterfaceRequestHandler
+	implements
+		IPageRequestHandler,
+		IComponentRequestHandler,
+		ILoggableRequestHandler
+{
+
+	private static final Logger LOG = LoggerFactory.getLogger(ListenerInterfaceRequestHandler.class);
+
+	private final IPageAndComponentProvider pageComponentProvider;
+
+	private final RequestListenerInterface listenerInterface;
+
+	private final Integer behaviorId;
+
+	private ListenerInterfaceLogData logData;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param pageComponentProvider
+	 * @param listenerInterface
+	 * @param behaviorIndex
+	 */
+	public ListenerInterfaceRequestHandler(IPageAndComponentProvider pageComponentProvider,
+		RequestListenerInterface listenerInterface, Integer behaviorIndex)
+	{
+		Args.notNull(pageComponentProvider, "pageComponentProvider");
+		Args.notNull(listenerInterface, "listenerInterface");
+
+		this.pageComponentProvider = pageComponentProvider;
+		this.listenerInterface = listenerInterface;
+		behaviorId = behaviorIndex;
+	}
+
+	/**
+	 * Construct.
+	 * 
+	 * @param pageComponentProvider
+	 * @param listenerInterface
+	 */
+	public ListenerInterfaceRequestHandler(PageAndComponentProvider pageComponentProvider,
+		RequestListenerInterface listenerInterface)
+	{
+		this(pageComponentProvider, listenerInterface, null);
+	}
+
+	@Override
+	public IRequestableComponent getComponent()
+	{
+		return pageComponentProvider.getComponent();
+	}
+
+	@Override
+	public IRequestablePage getPage()
+	{
+		return pageComponentProvider.getPageInstance();
+	}
+
+	@Override
+	public Class<? extends IRequestablePage> getPageClass()
+	{
+		return pageComponentProvider.getPageClass();
+	}
+
+	@Override
+	public Integer getPageId()
+	{
+		return pageComponentProvider.getPageId();
+	}
+
+	@Override
+	public PageParameters getPageParameters()
+	{
+		return pageComponentProvider.getPageParameters();
+	}
+
+	/**
+	 * @see org.apache.wicket.request.IRequestHandler#detach(org.apache.wicket.request.IRequestCycle)
+	 */
+	@Override
+	public void detach(IRequestCycle requestCycle)
+	{
+		if (logData == null)
+		{
+			logData = new ListenerInterfaceLogData(pageComponentProvider, listenerInterface,
+				behaviorId);
+		}
+		pageComponentProvider.detach();
+	}
+
+	/**
+	 * Returns the listener interface.
+	 * 
+	 * @return listener interface
+	 */
+	public RequestListenerInterface getListenerInterface()
+	{
+		return listenerInterface;
+	}
+
+	/**
+	 * Index of target behavior or <code>null</code> if component is the target.
+	 * 
+	 * @return behavior index or <code>null</code>
+	 */
+	public Integer getBehaviorIndex()
+	{
+		return behaviorId;
+	}
+
+	/**
+	 * @see org.apache.wicket.request.IRequestHandler#respond(org.apache.wicket.request.IRequestCycle)
+	 */
+	@Override
+	public void respond(final IRequestCycle requestCycle)
+	{
+		final IRequestablePage page = getPage();
+		final boolean freshPage = pageComponentProvider.isPageInstanceFresh();
+		final boolean isAjax = ((WebRequest)requestCycle.getRequest()).isAjax();
+
+		IRequestableComponent component = null;
+		try
+		{
+			component = getComponent();
+		}
+		catch (ComponentNotFoundException e)
+		{
+			// either the page is stateless and the component we are looking for is not added in the
+			// constructor
+			// or the page is stateful+stale and a new instances was created by pageprovider
+			// we denote this by setting component to null
+			component = null;
+		}
+
+		if ((component == null && freshPage) ||
+			(component != null && getComponent().getPage() == page))
+		{
+			if (page instanceof Page)
+			{
+				// initialize the page to be able to check whether it is stateless
+				((Page)page).internalInitialize();
+			}
+			final boolean isStateless = page.isPageStateless();
+
+			RedirectPolicy policy = isStateless ? RedirectPolicy.NEVER_REDIRECT
+				: RedirectPolicy.AUTO_REDIRECT;
+			final IPageProvider pageProvider = new PageProvider(page);
+
+			if (freshPage && isStateless == false)
+			{
+				// A listener interface is invoked on an expired page.
+
+				// If the page is stateful then we cannot assume that the listener interface is
+				// invoked on its initial state (right after page initialization) and that its
+				// component and/or behavior will be available. That's why the listener interface
+				// should be ignored and the best we can do is to re-paint the newly constructed
+				// page.
+
+				if (LOG.isDebugEnabled())
+				{
+					LOG.debug(
+						"A ListenerInterface '{}' assigned to '{}' is executed on an expired stateful page. "
+							+ "Scheduling re-create of the page and ignoring the listener interface...",
+						listenerInterface, getComponentPath());
+				}
+
+				if (isAjax)
+				{
+					policy = RedirectPolicy.ALWAYS_REDIRECT;
+				}
+
+				requestCycle.scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler(
+					pageProvider, policy));
+				return;
+			}
+
+			if (isAjax == false && listenerInterface.isRenderPageAfterInvocation())
+			{
+				// schedule page render after current request handler is done. this can be
+				// overridden during invocation of listener
+				// method (i.e. by calling RequestCycle#setResponsePage)
+				requestCycle.scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler(
+					pageProvider, policy));
+			}
+
+			invokeListener();
+
+		}
+		else
+		{
+			throw new WicketRuntimeException("Component " + getComponent() +
+				" has been removed from page.");
+		}
+	}
+
+	private void invokeListener()
+	{
+		if (getBehaviorIndex() == null)
+		{
+			listenerInterface.invoke(getComponent());
+		}
+		else
+		{
+			try
+			{
+				Behavior behavior = getComponent().getBehaviorById(behaviorId);
+				listenerInterface.invoke(getComponent(), behavior);
+			}
+			catch (IndexOutOfBoundsException e)
+			{
+				throw new WicketRuntimeException("Couldn't find component behavior.", e);
+			}
+
+		}
+	}
+
+	@Override
+	public final boolean isPageInstanceCreated()
+	{
+		return pageComponentProvider.hasPageInstance();
+	}
+
+	@Override
+	public final String getComponentPath()
+	{
+		return pageComponentProvider.getComponentPath();
+	}
+
+	@Override
+	public final Integer getRenderCount()
+	{
+		return pageComponentProvider.getRenderCount();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public ListenerInterfaceLogData getLogData()
+	{
+		return logData;
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInvocationNotAllowedException.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInvocationNotAllowedException.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInvocationNotAllowedException.java
new file mode 100644
index 0000000..49d4ffc
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/ListenerInvocationNotAllowedException.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.RequestListenerInterface;
+import org.apache.wicket.behavior.Behavior;
+
+/**
+ * Thrown when a listener invocation is attempted on a component or behavior that does not allow it.
+ * For example, somehow the user attempted to invoke link's onclick method on a disabled link.
+ * 
+ * @author igor
+ */
+public class ListenerInvocationNotAllowedException extends RuntimeException
+{
+	private static final long serialVersionUID = 1L;
+
+	private final Component component;
+	private final Behavior behavior;
+	private final RequestListenerInterface iface;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param iface
+	 * @param component
+	 * @param behavior
+	 * @param message
+	 */
+	public ListenerInvocationNotAllowedException(RequestListenerInterface iface,
+		Component component, Behavior behavior, String message)
+	{
+		super(message + detail(iface, component, behavior));
+		this.iface = iface;
+		this.component = component;
+		this.behavior = behavior;
+
+	}
+
+	private static String detail(RequestListenerInterface iface, Component component,
+		Behavior behavior)
+	{
+		StringBuilder detail = new StringBuilder("Component: ").append(component.toString(false));
+		if (behavior != null)
+		{
+			detail.append(" Behavior: ").append(behavior.toString());
+		}
+		detail.append(" Listener: ").append(iface.toString());
+		return detail.toString();
+	}
+
+	/**
+	 * @return component that was the target of invocation or hosted the behavior that was
+	 */
+	public Component getComponent()
+	{
+		return component;
+	}
+
+	/**
+	 * @return behavior that was the target of invocation or {@code null}
+	 */
+	public Behavior getBehavior()
+	{
+		return behavior;
+	}
+
+
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageAndComponentProvider.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageAndComponentProvider.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageAndComponentProvider.java
new file mode 100644
index 0000000..93bf6ac
--- /dev/null
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/PageAndComponentProvider.java
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.request.component.IRequestableComponent;
+import org.apache.wicket.request.component.IRequestablePage;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.util.lang.Args;
+
+/**
+ * Extension of {@link PageProvider} that is also capable of providing a Component belonging to the
+ * page.
+ * 
+ * @see PageProvider
+ * 
+ * @author Matej Knopp
+ */
+public class PageAndComponentProvider extends PageProvider implements IPageAndComponentProvider
+{
+	private IRequestableComponent component;
+
+	private String componentPath;
+
+	/**
+	 * @see PageProvider#PageProvider(IRequestablePage)
+	 * 
+	 * @param page
+	 * @param componentPath
+	 */
+	public PageAndComponentProvider(IRequestablePage page, String componentPath)
+	{
+		super(page);
+		setComponentPath(componentPath);
+	}
+
+	/**
+	 * @see PageProvider#PageProvider(IRequestablePage)
+	 * 
+	 * @param page
+	 * @param component
+	 */
+	public PageAndComponentProvider(IRequestablePage page, IRequestableComponent component)
+	{
+		super(page);
+
+		Args.notNull(component, "component");
+
+		this.component = component;
+	}
+
+	/**
+	 * @see PageProvider#PageProvider(Class, PageParameters)
+	 * 
+	 * @param pageClass
+	 * @param pageParameters
+	 * @param componentPath
+	 */
+	public PageAndComponentProvider(Class<? extends IRequestablePage> pageClass,
+		PageParameters pageParameters, String componentPath)
+	{
+		super(pageClass, pageParameters);
+		setComponentPath(componentPath);
+	}
+
+	/**
+	 * @see PageProvider#PageProvider(Class)
+	 * 
+	 * @param pageClass
+	 * @param componentPath
+	 */
+	public PageAndComponentProvider(Class<? extends IRequestablePage> pageClass,
+		String componentPath)
+	{
+		super(pageClass);
+		setComponentPath(componentPath);
+	}
+
+	/**
+	 * @see PageProvider#PageProvider(int, Class, Integer)
+	 * 
+	 * @param pageId
+	 * @param pageClass
+	 * @param renderCount
+	 * @param componentPath
+	 */
+	public PageAndComponentProvider(int pageId, Class<? extends IRequestablePage> pageClass,
+		Integer renderCount, String componentPath)
+	{
+		super(pageId, pageClass, renderCount);
+		setComponentPath(componentPath);
+	}
+
+	/**
+	 * @see PageProvider#PageProvider(int, Class, PageParameters, Integer)
+	 * 
+	 * @param pageId
+	 * @param pageClass
+	 * @param pageParameters
+	 * @param renderCount
+	 * @param componentPath
+	 */
+	public PageAndComponentProvider(int pageId, Class<? extends IRequestablePage> pageClass,
+		PageParameters pageParameters, Integer renderCount, String componentPath)
+	{
+		super(pageId, pageClass, pageParameters, renderCount);
+		setComponentPath(componentPath);
+	}
+
+	/**
+	 * @see PageProvider#PageProvider(int, Integer)
+	 * 
+	 * @param pageId
+	 * @param renderCount
+	 * @param componentPath
+	 */
+	public PageAndComponentProvider(int pageId, Integer renderCount, String componentPath)
+	{
+		super(pageId, renderCount);
+		setComponentPath(componentPath);
+	}
+
+	public PageAndComponentProvider(IRequestablePage page, IRequestableComponent component,
+		PageParameters parameters)
+	{
+		super(page);
+
+		Args.notNull(component, "component");
+
+		this.component = component;
+		if (parameters != null)
+		{
+			setPageParameters(parameters);
+		}
+	}
+
+	/**
+	 * @see org.apache.wicket.request.handler.IPageAndComponentProvider#getComponent()
+	 */
+	@Override
+	public IRequestableComponent getComponent()
+	{
+		if (component == null)
+		{
+			IRequestablePage page = getPageInstance();
+			component = page.get(componentPath);
+			if (component == null)
+			{
+
+				/*
+				 * on stateless pages it is possible that the component may not yet exist because it
+				 * couldve been created in one of the lifecycle callbacks of this page. Lets invoke
+				 * the callbacks to give the page a chance to create the missing component.
+				 */
+
+				// make sure this page instance was just created so the page can be stateless
+				if (page.isPageStateless())
+				{
+					Page p = (Page)page;
+					p.internalInitialize();
+					p.internalPrepareForRender(false);
+					component = page.get(componentPath);
+				}
+			}
+		}
+		if (component == null)
+		{
+			throw new ComponentNotFoundException("Could not find component '" + componentPath +
+				"' on page '" + getPageClass());
+		}
+		return component;
+	}
+
+	/**
+	 * @see org.apache.wicket.request.handler.IPageAndComponentProvider#getComponentPath()
+	 */
+	@Override
+	public String getComponentPath()
+	{
+		if (componentPath != null)
+		{
+			return componentPath;
+		}
+		else
+		{
+			return component.getPageRelativePath();
+		}
+	}
+
+	/**
+	 * 
+	 * @param componentPath
+	 */
+	private void setComponentPath(String componentPath)
+	{
+		Args.notNull(componentPath, "componentPath");
+
+		this.componentPath = componentPath;
+	}
+}