You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2016/04/25 11:48:41 UTC

[03/17] wicket git commit: WICKET-6137 remove RequestListenerInterface

WICKET-6137 remove RequestListenerInterface


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/d1710298
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/d1710298
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/d1710298

Branch: refs/heads/master
Commit: d1710298c7e371f260299f732c58d0bf4d647161
Parents: 7dcdae5
Author: Sven Meier <sv...@apache.org>
Authored: Sat Mar 19 19:57:00 2016 +0100
Committer: Sven Meier <sv...@apache.org>
Committed: Mon Apr 25 11:44:33 2016 +0200

----------------------------------------------------------------------
 .../main/java/org/apache/wicket/Component.java  |  22 ++-
 .../org/apache/wicket/DefaultMapperContext.java |  12 --
 .../org/apache/wicket/IRequestListener.java     |   2 +
 .../org/apache/wicket/IResourceListener.java    |  39 ------
 .../java/org/apache/wicket/Initializer.java     |  13 --
 .../apache/wicket/RequestListenerInterface.java |  10 +-
 .../wicket/behavior/AbstractAjaxBehavior.java   |  16 ++-
 .../org/apache/wicket/behavior/Behavior.java    |   3 +-
 .../wicket/behavior/IBehaviorListener.java      |  36 -----
 ...markableListenerInterfaceRequestHandler.java |  31 ++--
 .../ListenerInterfaceRequestHandler.java        | 140 +++++++++++++------
 .../ListenerInvocationNotAllowedException.java  |  10 +-
 .../logger/ListenerInterfaceLogData.java        |  29 +---
 .../mapper/AbstractBookmarkableMapper.java      |  39 +-----
 .../request/mapper/AbstractComponentMapper.java |  27 ----
 .../core/request/mapper/IMapperContext.java     |  17 ---
 .../core/request/mapper/MountedMapper.java      |  11 +-
 .../core/request/mapper/PageInstanceMapper.java |  14 +-
 .../apache/wicket/markup/html/form/Check.java   |   2 +-
 .../wicket/markup/html/form/CheckBox.java       |  11 +-
 .../wicket/markup/html/form/CheckGroup.java     |   9 +-
 .../wicket/markup/html/form/DropDownChoice.java |  11 +-
 .../apache/wicket/markup/html/form/Form.java    |  11 +-
 .../markup/html/form/IFormSubmitListener.java   |  33 -----
 .../markup/html/form/IOnChangeListener.java     |  35 -----
 .../wicket/markup/html/form/ImageButton.java    |   9 +-
 .../apache/wicket/markup/html/form/Radio.java   |   2 +-
 .../wicket/markup/html/form/RadioChoice.java    |  11 +-
 .../wicket/markup/html/form/RadioGroup.java     |   9 +-
 .../wicket/markup/html/form/StatelessForm.java  |   2 +-
 .../apache/wicket/markup/html/image/Image.java  |  14 +-
 .../image/resource/LocalizedImageResource.java  |   5 +-
 .../wicket/markup/html/link/ILinkListener.java  |  32 -----
 .../wicket/markup/html/link/InlineFrame.java    |  11 +-
 .../apache/wicket/markup/html/link/Link.java    |  11 +-
 .../wicket/markup/html/link/ResourceLink.java   |  12 +-
 .../wicket/markup/html/link/StatelessLink.java  |   8 +-
 .../wicket/util/tester/BaseWicketTester.java    |  41 ++----
 .../apache/wicket/util/tester/FormTester.java   |   3 +-
 .../org/apache/wicket/BehaviorRequestTest.java  |  23 +--
 .../java/org/apache/wicket/BehaviorUrlTest.java |  11 +-
 .../ComponentWithLazyModelCreationTest.java     |  16 ++-
 .../behavior/ImmutableBehaviorIdsTest.java      |  11 +-
 .../ListenerInterfaceRequestHandlerTest.java    |  10 +-
 .../core/request/mapper/AbstractMapperTest.java |  13 --
 .../AbstractResourceReferenceMapperTest.java    |   1 -
 .../request/mapper/BookmarkableMapperTest.java  |  15 +-
 .../core/request/mapper/CryptoMapperTest.java   |  11 +-
 .../core/request/mapper/MountedMapperTest.java  |  17 +--
 .../core/request/mapper/PackageMapperTest.java  |  12 +-
 .../request/mapper/PageInstanceMapperTest.java  |   6 +-
 .../core/request/mapper/TestMapperContext.java  |  15 +-
 .../request/mapper/info/ComponentInfoTest.java  |  11 +-
 .../mapper/info/PageComponentInfoTest.java      |   5 +-
 .../wicket/examples/ajax/prototype/Index.java   |   9 +-
 wicket-examples/src/main/webapp/WEB-INF/web.xml |  21 ---
 .../captcha/kittens/KittenCaptchaPanel.java     |   4 +-
 .../request/mapper/info/ComponentInfo.java      |  49 +------
 58 files changed, 350 insertions(+), 663 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/Component.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Component.java b/wicket-core/src/main/java/org/apache/wicket/Component.java
index f9a8cd9..877e963 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Component.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Component.java
@@ -58,7 +58,6 @@ import org.apache.wicket.markup.head.StringHeaderItem;
 import org.apache.wicket.markup.html.IHeaderContributor;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.FormComponent;
-import org.apache.wicket.markup.html.form.IFormSubmitListener;
 import org.apache.wicket.markup.html.internal.HtmlHeaderContainer;
 import org.apache.wicket.markup.html.panel.DefaultMarkupSourcingStrategy;
 import org.apache.wicket.markup.html.panel.IMarkupSourcingStrategy;
@@ -852,7 +851,7 @@ public abstract class Component
 	 * 
 	 * @return {@code true} if component has been initialized
 	 */
-	final boolean isInitialized()
+	public final boolean isInitialized()
 	{
 		return getFlag(FLAG_INITIALIZED);
 	}
@@ -3343,19 +3342,17 @@ public abstract class Component
 	 *            The parameters that should be rendered into the urls
 	 * @return The URL
 	 */
-	public final CharSequence urlFor(final Behavior behaviour,
-		final RequestListenerInterface listener, final PageParameters parameters)
+	public final CharSequence urlFor(final Behavior behaviour, final PageParameters parameters)
 	{
 		int id = getBehaviorId(behaviour);
-		IRequestHandler handler = createRequestHandler(listener, parameters, id);
+		IRequestHandler handler = createRequestHandler(parameters, id);
 		return getRequestCycle().urlFor(handler);
 	}
 
 	/**
 	 * Create a suitable request handler depending whether the page is stateless or bookmarkable.
 	 */
-	private IRequestHandler createRequestHandler(RequestListenerInterface listener,
-		PageParameters parameters, Integer id)
+	private IRequestHandler createRequestHandler(PageParameters parameters, Integer id)
 	{
 		Page page = getPage();
 
@@ -3365,11 +3362,11 @@ public abstract class Component
 			|| (getApplication().getPageSettings().getRecreateBookmarkablePagesAfterExpiry()
 				&& page.isBookmarkable() && page.wasCreatedBookmarkable()))
 		{
-			return new BookmarkableListenerInterfaceRequestHandler(provider, listener, id);
+			return new BookmarkableListenerInterfaceRequestHandler(provider, id);
 		}
 		else
 		{
-			return new ListenerInterfaceRequestHandler(provider, listener, id);
+			return new ListenerInterfaceRequestHandler(provider, id);
 		}
 	}
 
@@ -3393,16 +3390,13 @@ public abstract class Component
 	 * 
 	 * @see RequestCycle#urlFor(IRequestHandler)
 	 * 
-	 * @param listener
-	 *            The listener interface that the URL should call
 	 * @param parameters
 	 *            The parameters that should be rendered into the urls
 	 * @return The URL
 	 */
-	public final CharSequence urlFor(final RequestListenerInterface listener,
-		final PageParameters parameters)
+	public final CharSequence urlFor(final PageParameters parameters)
 	{
-		IRequestHandler handler = createRequestHandler(listener, parameters, null);
+		IRequestHandler handler = createRequestHandler(parameters, null);
 		return getRequestCycle().urlFor(handler);
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/DefaultMapperContext.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/DefaultMapperContext.java b/wicket-core/src/main/java/org/apache/wicket/DefaultMapperContext.java
index 486dbf9..6527f96 100644
--- a/wicket-core/src/main/java/org/apache/wicket/DefaultMapperContext.java
+++ b/wicket-core/src/main/java/org/apache/wicket/DefaultMapperContext.java
@@ -82,18 +82,6 @@ public class DefaultMapperContext implements IMapperContext
 	}
 
 	@Override
-	public RequestListenerInterface requestListenerInterfaceFromString(final String interfaceName)
-	{
-		return RequestListenerInterface.forName(interfaceName);
-	}
-
-	@Override
-	public String requestListenerInterfaceToString(final RequestListenerInterface listenerInterface)
-	{
-		return listenerInterface.getName();
-	}
-
-	@Override
 	public IRequestablePage newPageInstance(final Class<? extends IRequestablePage> pageClass,
 		final PageParameters pageParameters)
 	{

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/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 350717f..d94416d 100644
--- a/wicket-core/src/main/java/org/apache/wicket/IRequestListener.java
+++ b/wicket-core/src/main/java/org/apache/wicket/IRequestListener.java
@@ -33,6 +33,8 @@ import org.apache.wicket.util.io.IClusterable;
  */
 public interface IRequestListener extends IClusterable
 {
+
+	boolean includeRenderCount();
 	
 	/**
 	 * Called when a request to a behavior is received.

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/IResourceListener.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/IResourceListener.java b/wicket-core/src/main/java/org/apache/wicket/IResourceListener.java
deleted file mode 100644
index 983594c..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/IResourceListener.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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;
-
-
-/**
- * Listens for requests regarding resources. Such resources are typically non-static in nature and
- * may even be created on the fly.
- * <p>
- * One use for resource listeners is that they may be used to create components such as Image which
- * respond to requests with a localized resource loaded from the classpath. The Image class allows
- * reusable components to transparently bundle localized image resources. Components that use Image
- * resources (instead of referencing static images in their markup) can be distributed as a
- * self-contained JAR file.
- * 
- * @see org.apache.wicket.markup.html.image.Image
- * @see org.apache.wicket.markup.html.image.resource.RenderedDynamicImageResource
- * @author Jonathan Locke
- */
-public interface IResourceListener extends IRequestListener
-{
-	/** Resource listener interface object */
-	RequestListenerInterface INTERFACE = new RequestListenerInterface(
-		IResourceListener.class).setIncludeRenderCount(false).setRenderPageAfterInvocation(false);
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/Initializer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Initializer.java b/wicket-core/src/main/java/org/apache/wicket/Initializer.java
index 19fa544..cb81938 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Initializer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Initializer.java
@@ -16,11 +16,6 @@
  */
 package org.apache.wicket;
 
-import org.apache.wicket.behavior.IBehaviorListener;
-import org.apache.wicket.markup.html.form.IFormSubmitListener;
-import org.apache.wicket.markup.html.form.IOnChangeListener;
-import org.apache.wicket.markup.html.link.ILinkListener;
-
 /**
  * Initializer for components in wicket core library.
  * 
@@ -34,14 +29,6 @@ public class Initializer implements IInitializer
 	@Override
 	public void init(Application application)
 	{
-		// Register listener interfaces explicitly (even though they implicitly
-		// register when loaded) because deserialization of an object that
-		// implements an interface does not load the interfaces it implements!
-		IBehaviorListener.INTERFACE.register();
-		IFormSubmitListener.INTERFACE.register();
-		ILinkListener.INTERFACE.register();
-		IOnChangeListener.INTERFACE.register();
-		IResourceListener.INTERFACE.register();
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/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 64c26f0..f45b09e 100644
--- a/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java
+++ b/wicket-core/src/main/java/org/apache/wicket/RequestListenerInterface.java
@@ -16,18 +16,14 @@
  */
 package org.apache.wicket;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.wicket.authorization.AuthorizationException;
 import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.request.RequestHandlerExecutor.ReplaceHandlerException;
-import org.apache.wicket.request.component.IRequestableComponent;
 import org.apache.wicket.core.request.handler.ListenerInvocationNotAllowedException;
+import org.apache.wicket.request.component.IRequestableComponent;
 import org.apache.wicket.util.lang.Classes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -175,7 +171,7 @@ public class RequestListenerInterface
 			// just return so that we have a silent fail and just re-render the
 			// page
 			log.info("component not enabled or visible; ignoring call. Component: " + component);
-			throw new ListenerInvocationNotAllowedException(this, component, null,
+			throw new ListenerInvocationNotAllowedException(component, null,
 				"Component rejected interface invocation");
 		}
 
@@ -200,7 +196,7 @@ public class RequestListenerInterface
 		{
 			log.warn("behavior not enabled; ignore call. Behavior {} at component {}", behavior,
 				component);
-			throw new ListenerInvocationNotAllowedException(this, component, behavior,
+			throw new ListenerInvocationNotAllowedException(component, behavior,
 				"Behavior rejected interface invocation. ");
 		}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/behavior/AbstractAjaxBehavior.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/behavior/AbstractAjaxBehavior.java b/wicket-core/src/main/java/org/apache/wicket/behavior/AbstractAjaxBehavior.java
index 5a25fc9..d4c9877 100644
--- a/wicket-core/src/main/java/org/apache/wicket/behavior/AbstractAjaxBehavior.java
+++ b/wicket-core/src/main/java/org/apache/wicket/behavior/AbstractAjaxBehavior.java
@@ -17,7 +17,7 @@
 package org.apache.wicket.behavior;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.RequestListenerInterface;
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.lang.Args;
@@ -30,7 +30,7 @@ import org.apache.wicket.util.lang.Args;
  * @author Ralf Ebert
  * @author Igor Vaynberg
  */
-public abstract class AbstractAjaxBehavior extends Behavior implements IBehaviorListener
+public abstract class AbstractAjaxBehavior extends Behavior implements IRequestListener
 {
 	private static final long serialVersionUID = 1L;
 
@@ -68,6 +68,12 @@ public abstract class AbstractAjaxBehavior extends Behavior implements IBehavior
 		onBind();
 	}
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return true;
+	}
+	
 	/**
 	 * Gets the url that references this handler.
 	 * 
@@ -81,11 +87,7 @@ public abstract class AbstractAjaxBehavior extends Behavior implements IBehavior
 				"Behavior must be bound to a component to create the URL");
 		}
 
-		final RequestListenerInterface rli;
-
-		rli = IBehaviorListener.INTERFACE;
-
-		return getComponent().urlFor(this, rli, new PageParameters());
+		return getComponent().urlFor(this, new PageParameters());
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/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 55517d2..2267e74 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
@@ -21,6 +21,7 @@ import java.lang.reflect.Method;
 import org.apache.wicket.Application;
 import org.apache.wicket.Component;
 import org.apache.wicket.IComponentAwareEventSink;
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.event.IEvent;
 import org.apache.wicket.lambda.WicketConsumer;
 import org.apache.wicket.lambda.WicketFunction;
@@ -153,7 +154,7 @@ public abstract class Behavior
 	 */
 	public boolean getStatelessHint(Component component)
 	{
-		if (this instanceof IBehaviorListener)
+		if (this instanceof IRequestListener)
 		{
 			// this behavior implements a callback interface, so it cannot be stateless
 			return false;

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/behavior/IBehaviorListener.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/behavior/IBehaviorListener.java b/wicket-core/src/main/java/org/apache/wicket/behavior/IBehaviorListener.java
deleted file mode 100644
index 8b029d0..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/behavior/IBehaviorListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.behavior;
-
-import org.apache.wicket.IRequestListener;
-import org.apache.wicket.RequestListenerInterface;
-
-/**
- * Listens for requests to behaviors. When {@link org.apache.wicket.behavior.Behavior}s are
- * 'enriched' with this interface, they can receive requests themselves. You can use this for
- * example to implement AJAX behavior, though you'll probably want to extend from
- * {@link org.apache.wicket.behavior.AbstractAjaxBehavior} directly instead in that case.
- * 
- * @author Eelco Hillenius
- */
-public interface IBehaviorListener extends IRequestListener
-{
-	/** Behavior listener interface */
-	RequestListenerInterface INTERFACE = new RequestListenerInterface(
-		IBehaviorListener.class);
-
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/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
index edc65a8..01eecfe 100644
--- 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
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.core.request.handler;
 
-import org.apache.wicket.RequestListenerInterface;
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.request.IRequestCycle;
 import org.apache.wicket.request.component.IRequestableComponent;
 import org.apache.wicket.request.component.IRequestablePage;
@@ -36,8 +36,6 @@ public class BookmarkableListenerInterfaceRequestHandler
 {
 	private final IPageAndComponentProvider pageComponentProvider;
 
-	private final RequestListenerInterface listenerInterface;
-
 	private final Integer behaviorIndex;
 
 	/**
@@ -49,13 +47,11 @@ public class BookmarkableListenerInterfaceRequestHandler
 	 */
 	public BookmarkableListenerInterfaceRequestHandler(
 		IPageAndComponentProvider pageComponentProvider,
-		RequestListenerInterface listenerInterface, Integer behaviorIndex)
+		Integer behaviorIndex)
 	{
 		Args.notNull(pageComponentProvider, "pageComponentProvider");
-		Args.notNull(listenerInterface, "listenerInterface");
 
 		this.pageComponentProvider = pageComponentProvider;
-		this.listenerInterface = listenerInterface;
 		this.behaviorIndex = behaviorIndex;
 	}
 
@@ -65,10 +61,17 @@ public class BookmarkableListenerInterfaceRequestHandler
 	 * @param pageComponentProvider
 	 * @param listenerInterface
 	 */
-	public BookmarkableListenerInterfaceRequestHandler(
-		PageAndComponentProvider pageComponentProvider, RequestListenerInterface listenerInterface)
+	public BookmarkableListenerInterfaceRequestHandler(PageAndComponentProvider pageComponentProvider)
 	{
-		this(pageComponentProvider, listenerInterface, null);
+		this(pageComponentProvider, null);
+	}
+
+	public boolean includeRenderCount() {
+		if (behaviorIndex == null) {
+			return ((IRequestListener)getComponent()).includeRenderCount();
+		} else {
+			return ((IRequestListener)getComponent().getBehaviorById(getBehaviorIndex())).includeRenderCount();
+		}
 	}
 
 	/**
@@ -132,16 +135,6 @@ public class BookmarkableListenerInterfaceRequestHandler
 	}
 
 	/**
-	 * 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
 	 *

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/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
index ce3286f..a098f02 100644
--- 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
@@ -16,8 +16,9 @@
  */
 package org.apache.wicket.core.request.handler;
 
+import org.apache.wicket.Component;
+import org.apache.wicket.IRequestListener;
 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;
@@ -43,13 +44,11 @@ public class ListenerInterfaceRequestHandler
 		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;
@@ -61,14 +60,11 @@ public class ListenerInterfaceRequestHandler
 	 * @param listenerInterface
 	 * @param behaviorIndex
 	 */
-	public ListenerInterfaceRequestHandler(IPageAndComponentProvider pageComponentProvider,
-		RequestListenerInterface listenerInterface, Integer behaviorIndex)
+	public ListenerInterfaceRequestHandler(IPageAndComponentProvider pageComponentProvider, Integer behaviorIndex)
 	{
 		Args.notNull(pageComponentProvider, "pageComponentProvider");
-		Args.notNull(listenerInterface, "listenerInterface");
 
 		this.pageComponentProvider = pageComponentProvider;
-		this.listenerInterface = listenerInterface;
 		behaviorId = behaviorIndex;
 	}
 
@@ -78,12 +74,19 @@ public class ListenerInterfaceRequestHandler
 	 * @param pageComponentProvider
 	 * @param listenerInterface
 	 */
-	public ListenerInterfaceRequestHandler(PageAndComponentProvider pageComponentProvider,
-		RequestListenerInterface listenerInterface)
+	public ListenerInterfaceRequestHandler(PageAndComponentProvider pageComponentProvider)
 	{
-		this(pageComponentProvider, listenerInterface, null);
+		this(pageComponentProvider, null);
 	}
 
+	public boolean includeRenderCount() {
+		if (behaviorId == null) {
+			return ((IRequestListener)getComponent()).includeRenderCount();
+		} else {
+			return ((IRequestListener)getComponent().getBehaviorById(getBehaviorIndex())).includeRenderCount();
+		}
+	}
+	
 	@Override
 	public IRequestableComponent getComponent()
 	{
@@ -122,23 +125,12 @@ public class ListenerInterfaceRequestHandler
 	{
 		if (logData == null)
 		{
-			logData = new ListenerInterfaceLogData(pageComponentProvider, listenerInterface,
-				behaviorId);
+			logData = new ListenerInterfaceLogData(pageComponentProvider, 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>
@@ -188,7 +180,6 @@ public class ListenerInterfaceRequestHandler
 		RedirectPolicy policy = isStateless
 			? RedirectPolicy.NEVER_REDIRECT
 			: RedirectPolicy.AUTO_REDIRECT;
-		final IPageProvider pageProvider = new PageProvider(page);
 
 		final boolean canCallListenerInterfaceAfterExpiry = component != null
 				? component.canCallListenerInterfaceAfterExpiry()
@@ -207,9 +198,9 @@ public class ListenerInterfaceRequestHandler
 			if (LOG.isDebugEnabled())
 			{
 				LOG.debug(
-					"A ListenerInterface '{}' assigned to '{}' is executed on an expired stateful page. "
+					"A ListenerInterface assigned to '{}' is executed on an expired stateful page. "
 						+ "Scheduling re-create of the page and ignoring the listener interface...",
-					listenerInterface, getComponentPath());
+					getComponentPath());
 			}
 
 			if (isAjax)
@@ -218,34 +209,25 @@ public class ListenerInterfaceRequestHandler
 			}
 
 			requestCycle.scheduleRequestHandlerAfterCurrent(new RenderPageRequestHandler(
-				pageProvider, policy));
+				new PageProvider(page), 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();
+		invokeListener(requestCycle, policy, isAjax);
 	}
 
-	private void invokeListener()
+	private void invokeListener(IRequestCycle requestCycle, RedirectPolicy policy, boolean ajax)
 	{
 		if (getBehaviorIndex() == null)
 		{
-			listenerInterface.invoke(getComponent());
+			invoke(requestCycle, policy, ajax, getComponent());
 		}
 		else
 		{
 			try
 			{
 				Behavior behavior = getComponent().getBehaviorById(behaviorId);
-				listenerInterface.invoke(getComponent(), behavior);
+				invoke(requestCycle, policy, ajax, getComponent(), behavior);
 			}
 			catch (IndexOutOfBoundsException e)
 			{
@@ -254,6 +236,84 @@ public class ListenerInterfaceRequestHandler
 
 		}
 	}
+	
+	/**
+	 * Invokes a given interface on a component.
+	 * 
+	 * @param rcomponent
+	 *            The component
+	 * 
+	 * @throws ListenerInvocationNotAllowedException
+	 *             when listener invocation attempted on a component that does not allow it
+	 */
+	private final void invoke(final IRequestCycle requestCycle, RedirectPolicy policy, boolean ajax, final IRequestableComponent rcomponent)
+	{
+		// we are in Wicket core land
+		final Component component = (Component)rcomponent;
+
+		if (!component.canCallListenerInterface(null))
+		{
+			// just return so that we have a silent fail and just re-render the
+			// page
+			LOG.info("component not enabled or visible; ignoring call. Component: " + component);
+			throw new ListenerInvocationNotAllowedException(component, null,
+				"Component rejected interface invocation");
+		}
+
+		internalInvoke(requestCycle, policy, ajax, component, component);
+	}
+
+	/**
+	 * Invokes a given interface on a component's behavior.
+	 * 
+	 * @param rcomponent
+	 *            The component
+	 * @param behavior
+	 * @throws ListenerInvocationNotAllowedException
+	 *             when listener invocation attempted on a component that does not allow it
+	 */
+	private final void invoke(final IRequestCycle requestCycle, RedirectPolicy policy, boolean ajax, final IRequestableComponent rcomponent, final Behavior behavior)
+	{
+		// we are in Wicket core land
+		final Component component = (Component)rcomponent;
+
+		if (!behavior.canCallListenerInterface(component, null))
+		{
+			LOG.warn("behavior not enabled; ignore call. Behavior {} at component {}", behavior,
+				component);
+			throw new ListenerInvocationNotAllowedException(component, behavior,
+				"Behavior rejected interface invocation. ");
+		}
+
+		internalInvoke(requestCycle, policy, ajax, component, behavior);
+	}
+
+	private void internalInvoke(final IRequestCycle requestCycle, RedirectPolicy policy, boolean ajax, final Component component, final Object target)
+	{
+		// save a reference to the page because the component can be removed
+		// during the invocation of the listener and thus lose its parent
+		Page page = component.getPage();
+
+		// initialization is required for stateless pages
+		if (!page.isInitialized())
+		{
+			page.internalInitialize();
+		}
+
+		IRequestListener requestListener = (IRequestListener)target;
+		
+		if (requestListener.includeRenderCount() && !ajax)
+		{
+			// 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(
+				new PageProvider(page), policy));
+		}
+
+
+		requestListener.onRequest();
+	}
 
 	@Override
 	public final boolean isPageInstanceCreated()

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/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
index a97d99d..f878b89 100644
--- 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
@@ -17,7 +17,6 @@
 package org.apache.wicket.core.request.handler;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.behavior.Behavior;
 
 /**
@@ -36,20 +35,18 @@ public class ListenerInvocationNotAllowedException extends RuntimeException
 	/**
 	 * Constructor
 	 *
-	 * @param iface
 	 * @param component
 	 * @param behavior
 	 * @param message
 	 */
-	public ListenerInvocationNotAllowedException(RequestListenerInterface iface,
-		Component component, Behavior behavior, String message)
+	public ListenerInvocationNotAllowedException(Component component, Behavior behavior, String message)
 	{
-		super(message + detail(iface, component, behavior));
+		super(message + detail(component, behavior));
 		this.component = component;
 		this.behavior = behavior;
 	}
 
-	private static String detail(RequestListenerInterface iface, Component component,
+	private static String detail(Component component,
 		Behavior behavior)
 	{
 		StringBuilder detail = new StringBuilder("Component: ").append(component.toString(false));
@@ -57,7 +54,6 @@ public class ListenerInvocationNotAllowedException extends RuntimeException
 		{
 			detail.append(" Behavior: ").append(behavior.toString());
 		}
-		detail.append(" Listener: ").append(iface.toString());
 		return detail.toString();
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/core/request/handler/logger/ListenerInterfaceLogData.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/logger/ListenerInterfaceLogData.java b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/logger/ListenerInterfaceLogData.java
index 4a5ad40..5ed97a7 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/handler/logger/ListenerInterfaceLogData.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/handler/logger/ListenerInterfaceLogData.java
@@ -17,11 +17,9 @@
 package org.apache.wicket.core.request.handler.logger;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.core.request.handler.IPageAndComponentProvider;
 import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.IFormSubmitListener;
 import org.apache.wicket.markup.html.form.IFormSubmitter;
 import org.apache.wicket.request.component.IRequestableComponent;
 
@@ -38,7 +36,6 @@ public class ListenerInterfaceLogData extends PageLogData
 	private final String componentPath;
 	private final Integer behaviorIndex;
 	private Class<? extends Behavior> behaviorClass;
-	private final String interfaceName;
 	private Class<? extends IRequestableComponent> submittingComponentClass;
 	private String submittingComponentPath;
 
@@ -49,8 +46,7 @@ public class ListenerInterfaceLogData extends PageLogData
 	 * @param listenerInterface
 	 * @param behaviorIndex
 	 */
-	public ListenerInterfaceLogData(IPageAndComponentProvider pageAndComponentProvider,
-		RequestListenerInterface listenerInterface, Integer behaviorIndex)
+	public ListenerInterfaceLogData(IPageAndComponentProvider pageAndComponentProvider, Integer behaviorIndex)
 	{
 		super(pageAndComponentProvider);
 		componentClass = tryToGetComponentClass(pageAndComponentProvider);
@@ -73,15 +69,12 @@ public class ListenerInterfaceLogData extends PageLogData
 		{
 			behaviorClass = null;
 		}
-		interfaceName = listenerInterface.getName();
-		if (listenerInterface.getListenerInterfaceClass().equals(IFormSubmitListener.class))
+		
+		final Component formSubmitter = tryToGetFormSubmittingComponent(pageAndComponentProvider);
+		if (formSubmitter != null)
 		{
-			final Component formSubmitter = tryToGetFormSubmittingComponent(pageAndComponentProvider);
-			if (formSubmitter != null)
-			{
-				submittingComponentClass = formSubmitter.getClass();
-				submittingComponentPath = formSubmitter.getPageRelativePath();
-			}
+			submittingComponentClass = formSubmitter.getClass();
+			submittingComponentPath = formSubmitter.getPageRelativePath();
 		}
 	}
 
@@ -166,14 +159,6 @@ public class ListenerInterfaceLogData extends PageLogData
 	}
 
 	/**
-	 * @return interfaceName
-	 */
-	public final String getInterfaceName()
-	{
-		return interfaceName;
-	}
-
-	/**
 	 * @return submittingComponentClass
 	 */
 	public Class<? extends IRequestableComponent> getSubmittingComponentClass()
@@ -213,8 +198,6 @@ public class ListenerInterfaceLogData extends PageLogData
 			sb.append(",behaviorClass=");
 			sb.append(getBehaviorClass().getName());
 		}
-		sb.append(",interfaceName=");
-		sb.append(getInterfaceName());
 		if (getSubmittingComponentClass() != null)
 		{
 			sb.append(",submittingComponentClass=");

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
index 4d34e8c..963c698 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapper.java
@@ -19,7 +19,6 @@ package org.apache.wicket.core.request.mapper;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.core.request.handler.BookmarkableListenerInterfaceRequestHandler;
 import org.apache.wicket.core.request.handler.BookmarkablePageRequestHandler;
 import org.apache.wicket.core.request.handler.IPageRequestHandler;
@@ -31,7 +30,6 @@ import org.apache.wicket.protocol.http.PageExpiredException;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.IRequestHandlerDelegate;
-import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.component.IRequestablePage;
@@ -297,41 +295,18 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper
 		PageInfo pageInfo = pageComponentInfo.getPageInfo();
 		ComponentInfo componentInfo = pageComponentInfo.getComponentInfo();
 		Integer renderCount = null;
-		RequestListenerInterface listenerInterface = null;
 
 		if (componentInfo != null)
 		{
 			renderCount = componentInfo.getRenderCount();
-			listenerInterface = requestListenerInterfaceFromString(componentInfo.getListenerInterface());
 		}
 
-		if (listenerInterface != null)
-		{
-			PageAndComponentProvider provider = new PageAndComponentProvider(pageInfo.getPageId(),
-				pageClass, pageParameters, renderCount, componentInfo.getComponentPath());
+		PageAndComponentProvider provider = new PageAndComponentProvider(pageInfo.getPageId(),
+			pageClass, pageParameters, renderCount, componentInfo.getComponentPath());
 
-			provider.setPageSource(getContext());
+		provider.setPageSource(getContext());
 
-			return new ListenerInterfaceRequestHandler(provider, listenerInterface,
-				componentInfo.getBehaviorId());
-		}
-		else
-		{
-			if (logger.isWarnEnabled())
-			{
-				if (componentInfo != null)
-				{
-					logger.warn("Unknown listener interface '{}'",
-						componentInfo.getListenerInterface());
-				}
-				else
-				{
-					logger.warn("Cannot extract the listener interface for PageComponentInfo: '{}'" +
-						pageComponentInfo);
-				}
-			}
-			return null;
-		}
+		return new ListenerInterfaceRequestHandler(provider, componentInfo.getBehaviorId());
 	}
 
 	/**
@@ -463,15 +438,13 @@ public abstract class AbstractBookmarkableMapper extends AbstractComponentMapper
 			}
 
 			Integer renderCount = null;
-			if (handler.getListenerInterface().isIncludeRenderCount())
+			if (handler.includeRenderCount())
 			{
 				renderCount = handler.getRenderCount();
 			}
 
 			PageInfo pageInfo = getPageInfo(handler);
-			ComponentInfo componentInfo = new ComponentInfo(renderCount,
-				requestListenerInterfaceToString(handler.getListenerInterface()),
-				handler.getComponentPath(), handler.getBehaviorIndex());
+			ComponentInfo componentInfo = new ComponentInfo(renderCount, handler.getComponentPath(), handler.getBehaviorIndex());
 
 			PageParameters parameters = getRecreateMountedPagesAfterExpiry() ? new PageParameters(
 				handler.getPage().getPageParameters()).mergeWith(handler.getPageParameters())

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractComponentMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractComponentMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractComponentMapper.java
index 923a43f..71a28f5 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractComponentMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/AbstractComponentMapper.java
@@ -17,7 +17,6 @@
 package org.apache.wicket.core.request.mapper;
 
 import org.apache.wicket.Application;
-import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.core.util.lang.WicketObjects;
 import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.Url;
@@ -48,32 +47,6 @@ public abstract class AbstractComponentMapper extends AbstractMapper implements
 	}
 
 	/**
-	 * Converts the specified listener interface to String.
-	 *
-	 * @param listenerInterface
-	 * @return listenerInterface name as string
-	 */
-	protected String requestListenerInterfaceToString(RequestListenerInterface listenerInterface)
-	{
-		Args.notNull(listenerInterface, "listenerInterface");
-
-		return getContext().requestListenerInterfaceToString(listenerInterface);
-	}
-
-	/**
-	 * Creates listener interface from the specified string
-	 *
-	 * @param interfaceName
-	 * @return listener interface
-	 */
-	protected RequestListenerInterface requestListenerInterfaceFromString(String interfaceName)
-	{
-		Args.notEmpty(interfaceName, "interfaceName");
-
-		return getContext().requestListenerInterfaceFromString(interfaceName);
-	}
-
-	/**
 	 * Extracts the {@link PageComponentInfo} from the URL. The {@link PageComponentInfo} is encoded
 	 * as the very first query parameter and the parameter consists of name only (no value).
 	 *

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/IMapperContext.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/IMapperContext.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/IMapperContext.java
index 52366d3..792904f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/IMapperContext.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/IMapperContext.java
@@ -16,7 +16,6 @@
  */
 package org.apache.wicket.core.request.mapper;
 
-import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.request.resource.ResourceReferenceRegistry;
 
@@ -53,22 +52,6 @@ public interface IMapperContext extends IPageSource
 	ResourceReferenceRegistry getResourceReferenceRegistry();
 
 	/**
-	 * Returns the listener interface name as string.
-	 *
-	 * @param listenerInterface
-	 * @return listener interface name as string
-	 */
-	String requestListenerInterfaceToString(RequestListenerInterface listenerInterface);
-
-	/**
-	 * Returns listener interface for the name
-	 *
-	 * @param interfaceName
-	 * @return listener interface
-	 */
-	RequestListenerInterface requestListenerInterfaceFromString(String interfaceName);
-
-	/**
 	 * Returns the home page class.
 	 *
 	 * @return home page class

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
index 965b316..1b6aa28 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/MountedMapper.java
@@ -18,7 +18,6 @@ package org.apache.wicket.core.request.mapper;
 
 import java.util.function.Supplier;
 
-import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.Request;
@@ -166,19 +165,15 @@ public class MountedMapper extends AbstractBookmarkableMapper
 			IRequestablePage page = handler.getPage();
 			if (checkPageInstance(page))
 			{
-				String componentPath = handler.getComponentPath();
-				RequestListenerInterface listenerInterface = handler.getListenerInterface();
-
 				Integer renderCount = null;
-				if (listenerInterface.isIncludeRenderCount())
+				if (handler.includeRenderCount())
 				{
 					renderCount = page.getRenderCount();
 				}
 
+				String componentPath = handler.getComponentPath();
 				PageInfo pageInfo = getPageInfo(handler);
-				ComponentInfo componentInfo = new ComponentInfo(renderCount,
-					requestListenerInterfaceToString(listenerInterface), componentPath,
-					handler.getBehaviorIndex());
+				ComponentInfo componentInfo = new ComponentInfo(renderCount, componentPath, handler.getBehaviorIndex());
 				PageComponentInfo pageComponentInfo = new PageComponentInfo(pageInfo, componentInfo);
 				PageParameters parameters = new PageParameters(page.getPageParameters());
 				UrlInfo urlInfo = new UrlInfo(pageComponentInfo, page.getClass(),

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PageInstanceMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PageInstanceMapper.java b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PageInstanceMapper.java
index a034642..e983131 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PageInstanceMapper.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/request/mapper/PageInstanceMapper.java
@@ -16,7 +16,6 @@
  */
 package org.apache.wicket.core.request.mapper;
 
-import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler;
 import org.apache.wicket.core.request.handler.PageAndComponentProvider;
 import org.apache.wicket.core.request.handler.PageProvider;
@@ -86,11 +85,7 @@ public class PageInstanceMapper extends AbstractComponentMapper
 
 					provider.setPageSource(getContext());
 
-					// listener interface
-					RequestListenerInterface listenerInterface = requestListenerInterfaceFromString(componentInfo.getListenerInterface());
-
-					return new ListenerInterfaceRequestHandler(provider, listenerInterface,
-						componentInfo.getBehaviorId());
+					return new ListenerInterfaceRequestHandler(provider, componentInfo.getBehaviorId());
 				}
 			}
 		}
@@ -117,18 +112,15 @@ public class PageInstanceMapper extends AbstractComponentMapper
 			ListenerInterfaceRequestHandler handler = (ListenerInterfaceRequestHandler)requestHandler;
 			IRequestablePage page = handler.getPage();
 			String componentPath = handler.getComponentPath();
-			RequestListenerInterface listenerInterface = handler.getListenerInterface();
 
 			Integer renderCount = null;
-			if (listenerInterface.isIncludeRenderCount())
+			if (handler.includeRenderCount())
 			{
 				renderCount = page.getRenderCount();
 			}
 
 			PageInfo pageInfo = new PageInfo(page.getPageId());
-			ComponentInfo componentInfo = new ComponentInfo(renderCount,
-				requestListenerInterfaceToString(listenerInterface), componentPath,
-				handler.getBehaviorIndex());
+			ComponentInfo componentInfo = new ComponentInfo(renderCount, componentPath, handler.getBehaviorIndex());
 			info = new PageComponentInfo(pageInfo, componentInfo);
 		}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
index dab8129..91aff59 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Check.java
@@ -198,7 +198,7 @@ public class Check<T> extends LabeledWebMarkupContainer implements IGenericCompo
 		if (group.wantOnSelectionChangedNotifications())
 		{
 			// url that points to this components IOnChangeListener method
-			CharSequence url = group.urlFor(IOnChangeListener.INTERFACE, new PageParameters());
+			CharSequence url = group.urlFor(new PageParameters());
 
 			Form<?> form = group.findParent(Form.class);
 			if (form != null)

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
index 180f191..655533a 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckBox.java
@@ -18,6 +18,7 @@ package org.apache.wicket.markup.html.form;
 
 import java.util.Locale;
 
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
@@ -51,7 +52,7 @@ import org.apache.wicket.util.convert.IConverter;
  * 
  * @author Jonathan Locke
  */
-public class CheckBox extends FormComponent<Boolean> implements IOnChangeListener
+public class CheckBox extends FormComponent<Boolean> implements IRequestListener
 {
 	private static final long serialVersionUID = 1L;
 
@@ -74,6 +75,12 @@ public class CheckBox extends FormComponent<Boolean> implements IOnChangeListene
 		setType(Boolean.class);
 	}
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return true;
+	}
+	
 	/**
 	 * @see org.apache.wicket.markup.html.form.IOnChangeListener#onSelectionChanged()
 	 */
@@ -163,7 +170,7 @@ public class CheckBox extends FormComponent<Boolean> implements IOnChangeListene
 		// checkbox is clicked?
 		if (wantOnSelectionChangedNotifications())
 		{
-			CharSequence url = urlFor(IOnChangeListener.INTERFACE, new PageParameters());
+			CharSequence url = urlFor(new PageParameters());
 
 			Form<?> form = findParent(Form.class);
 			if (form != null)

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
index 1e6d804..5c62da5 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckGroup.java
@@ -19,6 +19,7 @@ package org.apache.wicket.markup.html.form;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -58,7 +59,7 @@ import org.slf4j.LoggerFactory;
  * @param <T>
  *            The model object type
  */
-public class CheckGroup<T> extends FormComponent<Collection<T>> implements IOnChangeListener
+public class CheckGroup<T> extends FormComponent<Collection<T>> implements IRequestListener
 {
 	private static final long serialVersionUID = 1L;
 
@@ -200,6 +201,12 @@ public class CheckGroup<T> extends FormComponent<Collection<T>> implements IOnCh
 		tag.remove("name");
 	}
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return true;
+	}
+	
 	/**
 	 * Called when a selection changes.
 	 */

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
index ca03dfd..60f97fa 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/DropDownChoice.java
@@ -18,6 +18,7 @@ package org.apache.wicket.markup.html.form;
 
 import java.util.List;
 
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.model.IModel;
@@ -63,7 +64,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
  * @param <T>
  *            The model object type
  */
-public class DropDownChoice<T> extends AbstractSingleSelectChoice<T> implements IOnChangeListener
+public class DropDownChoice<T> extends AbstractSingleSelectChoice<T> implements IRequestListener
 {
 	private static final long serialVersionUID = 1L;
 
@@ -202,6 +203,12 @@ public class DropDownChoice<T> extends AbstractSingleSelectChoice<T> implements
 		super(id, model, choices, renderer);
 	}
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return true;
+	}
+	
 	/**
 	 * Called when a selection changes.
 	 */
@@ -231,7 +238,7 @@ public class DropDownChoice<T> extends AbstractSingleSelectChoice<T> implements
 		{
 			// we do not want relative URL here, because it will be used by
 			// Form#dispatchEvent
-			CharSequence url = urlFor(IOnChangeListener.INTERFACE, new PageParameters());
+			CharSequence url = urlFor(new PageParameters());
 
 			Form<?> form = findParent(Form.class);
 			if (form != null)

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
index efa7137..fbdc568 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Form.java
@@ -30,6 +30,7 @@ import org.apache.commons.fileupload.FileUploadBase;
 import org.apache.commons.fileupload.FileUploadException;
 import org.apache.wicket.Component;
 import org.apache.wicket.IGenericComponent;
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.Page;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -146,7 +147,7 @@ import org.slf4j.LoggerFactory;
  */
 public class Form<T> extends WebMarkupContainer
 	implements
-		IFormSubmitListener,
+		IRequestListener,
 		IGenericComponent<T, Form<T>>
 {
 	private static final String HIDDEN_DIV_START = "<div style=\"width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden\">";
@@ -674,6 +675,12 @@ public class Form<T> extends WebMarkupContainer
 		return getFlag(FLAG_SUBMITTED);
 	}
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return true;
+	}
+	
 	/**
 	 * THIS METHOD IS NOT PART OF THE WICKET API. DO NOT ATTEMPT TO OVERRIDE OR CALL IT.
 	 * 
@@ -1646,7 +1653,7 @@ public class Form<T> extends WebMarkupContainer
 	 */
 	protected CharSequence getActionUrl()
 	{
-		return urlFor(IFormSubmitListener.INTERFACE, new PageParameters());
+		return urlFor(new PageParameters());
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IFormSubmitListener.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IFormSubmitListener.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IFormSubmitListener.java
deleted file mode 100644
index 3dfff96..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IFormSubmitListener.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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.markup.html.form;
-
-import org.apache.wicket.IRequestListener;
-import org.apache.wicket.RequestListenerInterface;
-
-/**
- * Listener interface that is called when a form is submitted.
- * 
- * @author Jonathan Locke
- */
-public interface IFormSubmitListener extends IRequestListener
-{
-	/** Listener interface */
-	RequestListenerInterface INTERFACE = new RequestListenerInterface(
-		IFormSubmitListener.class);
-
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IOnChangeListener.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IOnChangeListener.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IOnChangeListener.java
deleted file mode 100644
index 964c531..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/IOnChangeListener.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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.markup.html.form;
-
-import org.apache.wicket.IRequestListener;
-import org.apache.wicket.RequestListenerInterface;
-
-/**
- * Listener method for OnChange events of dropdown lists and onclick events of CheckBoxes and
- * RadioChoice components. When any of those components wantOnSelectionChangedNotifications() method
- * returns true, a javascript onchange or onclick handler will be generated that calls this
- * interface method when the user changes the selection.
- * 
- * @author Eelco Hillenius
- */
-public interface IOnChangeListener extends IRequestListener
-{
-	/** Listener interface */
-	RequestListenerInterface INTERFACE = new RequestListenerInterface(
-		IOnChangeListener.class);
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ImageButton.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ImageButton.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ImageButton.java
index 978d138..702daad 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ImageButton.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/ImageButton.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.markup.html.form;
 
-import org.apache.wicket.IResourceListener;
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.image.resource.LocalizedImageResource;
 import org.apache.wicket.model.IModel;
@@ -34,7 +34,7 @@ import org.apache.wicket.request.resource.ResourceReference;
  * 
  * @author Jonathan Locke
  */
-public class ImageButton extends Button implements IResourceListener
+public class ImageButton extends Button implements IRequestListener
 {
 	private static final long serialVersionUID = 1L;
 
@@ -126,6 +126,11 @@ public class ImageButton extends Button implements IResourceListener
 		this(id, new Model<String>(string));
 	}
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return false;
+	}
 
 	/**
 	 * @see org.apache.wicket.IResourceListener#onResourceRequested()

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
index 20965b2..8db42ed 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/Radio.java
@@ -183,7 +183,7 @@ public class Radio<T> extends LabeledWebMarkupContainer implements IGenericCompo
 		if (group.wantOnSelectionChangedNotifications())
 		{
 			// url that points to this components IOnChangeListener method
-			CharSequence url = group.urlFor(IOnChangeListener.INTERFACE, new PageParameters());
+			CharSequence url = group.urlFor(new PageParameters());
 
 			Form<?> form = group.findParent(Form.class);
 			if (form != null)

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
index e8af55e..1d336ea 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioChoice.java
@@ -19,6 +19,7 @@ package org.apache.wicket.markup.html.form;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.model.IModel;
@@ -65,7 +66,7 @@ import org.apache.wicket.util.value.IValueMap;
  * @param <T>
  *            The model object type
  */
-public class RadioChoice<T> extends AbstractSingleSelectChoice<T> implements IOnChangeListener
+public class RadioChoice<T> extends AbstractSingleSelectChoice<T> implements IRequestListener
 {
 	private static final long serialVersionUID = 1L;
 
@@ -244,6 +245,12 @@ public class RadioChoice<T> extends AbstractSingleSelectChoice<T> implements IOn
 		tag.remove("name");
 	}
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return true;
+	}
+	
 	/**
 	 * @see org.apache.wicket.markup.html.form.IOnChangeListener#onSelectionChanged()
 	 */
@@ -527,7 +534,7 @@ public class RadioChoice<T> extends AbstractSingleSelectChoice<T> implements IOn
 			// when the option is clicked?
 			if (wantOnSelectionChangedNotifications())
 			{
-				CharSequence url = urlFor(IOnChangeListener.INTERFACE, new PageParameters());
+				CharSequence url = urlFor(new PageParameters());
 
 				Form<?> form = findParent(Form.class);
 				if (form != null)

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
index e4f142e..795132d 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/RadioGroup.java
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.markup.html.form;
 
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -47,7 +48,7 @@ import org.apache.wicket.util.visit.IVisitor;
  * @param <T>
  *            The model object type
  */
-public class RadioGroup<T> extends FormComponent<T> implements IOnChangeListener
+public class RadioGroup<T> extends FormComponent<T> implements IRequestListener
 {
 	private static final long serialVersionUID = 1L;
 
@@ -163,6 +164,12 @@ public class RadioGroup<T> extends FormComponent<T> implements IOnChangeListener
 		tag.remove("name");
 	}
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return true;
+	}
+	
 	/**
 	 * Called when a selection changes.
 	 */

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/form/StatelessForm.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/StatelessForm.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/StatelessForm.java
index 2e41325..f258556 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/StatelessForm.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/StatelessForm.java
@@ -82,7 +82,7 @@ public class StatelessForm<T> extends Form<T>
 	@Override
 	protected CharSequence getActionUrl()
 	{
-		return urlFor(IFormSubmitListener.INTERFACE, getPage().getPageParameters());
+		return urlFor(getPage().getPageParameters());
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/image/Image.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/image/Image.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/image/Image.java
index 1b9622c..28f17ee 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/image/Image.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/image/Image.java
@@ -22,7 +22,7 @@ import java.util.Arrays;
 import java.util.List;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.IResourceListener;
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.MarkupStream;
@@ -49,7 +49,7 @@ import org.apache.wicket.request.resource.ResourceReference;
  * @author Jonathan Locke
  * @author Tobias Soloschenko
  */
-public class Image extends WebComponent implements IResourceListener
+public class Image extends WebComponent implements IRequestListener
 {
 	private static final long serialVersionUID = 1L;
 
@@ -210,6 +210,12 @@ public class Image extends WebComponent implements IResourceListener
 		this(id, new Model<>(string));
 	}
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return false;
+	}
+	
 	/**
 	 * @see org.apache.wicket.IResourceListener#onResourceRequested()
 	 */
@@ -582,9 +588,7 @@ public class Image extends WebComponent implements IResourceListener
 	@Override
 	public boolean canCallListenerInterface(Method method)
 	{
-		boolean isResource = method != null &&
-			IResourceListener.class.isAssignableFrom(method.getDeclaringClass());
-		if (isResource && isVisibleInHierarchy())
+		if (isVisibleInHierarchy())
 		{
 			// when the image data is requested we do not care if this component
 			// is enabled in

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/image/resource/LocalizedImageResource.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/image/resource/LocalizedImageResource.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/image/resource/LocalizedImageResource.java
index 10f25f0..93a2e39 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/image/resource/LocalizedImageResource.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/image/resource/LocalizedImageResource.java
@@ -20,9 +20,7 @@ import java.util.Locale;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.Component;
-import org.apache.wicket.util.io.IClusterable;
 import org.apache.wicket.IResourceFactory;
-import org.apache.wicket.IResourceListener;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.markup.ComponentTag;
@@ -33,6 +31,7 @@ import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.IResource.Attributes;
 import org.apache.wicket.request.resource.PackageResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.util.io.IClusterable;
 import org.apache.wicket.util.lang.Objects;
 import org.apache.wicket.util.parse.metapattern.Group;
 import org.apache.wicket.util.parse.metapattern.MetaPattern;
@@ -333,7 +332,7 @@ public final class LocalizedImageResource implements IClusterable
 		else
 		{
 			// Create URL to component
-			url = component.urlFor(IResourceListener.INTERFACE, resourceParameters);
+			url = component.urlFor(resourceParameters);
 		}
 
 		// Set the SRC attribute to point to the component or shared resource

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ILinkListener.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ILinkListener.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ILinkListener.java
deleted file mode 100644
index c2d37f1..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ILinkListener.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.markup.html.link;
-
-import org.apache.wicket.IRequestListener;
-import org.apache.wicket.RequestListenerInterface;
-
-/**
- * Listener method for link clicks.
- * 
- * @author Jonathan Locke
- */
-public interface ILinkListener extends IRequestListener
-{
-	/** Listener interface */
-	RequestListenerInterface INTERFACE = new RequestListenerInterface(
-		ILinkListener.class);
-}

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/link/InlineFrame.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/InlineFrame.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/InlineFrame.java
index 566bdae..0663620 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/InlineFrame.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/InlineFrame.java
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.markup.html.link;
 
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.Page;
 import org.apache.wicket.core.request.handler.IPageProvider;
 import org.apache.wicket.core.request.handler.PageProvider;
@@ -33,7 +34,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
  * 
  */
 
-public class InlineFrame extends WebMarkupContainer implements ILinkListener
+public class InlineFrame extends WebMarkupContainer implements IRequestListener
 {
 	private static final long serialVersionUID = 1L;
 
@@ -122,7 +123,7 @@ public class InlineFrame extends WebMarkupContainer implements ILinkListener
 	 */
 	protected CharSequence getURL()
 	{
-		return urlFor(ILinkListener.INTERFACE, new PageParameters());
+		return urlFor(new PageParameters());
 	}
 
 	/**
@@ -146,6 +147,12 @@ public class InlineFrame extends WebMarkupContainer implements ILinkListener
 		super.onComponentTag(tag);
 	}
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return true;
+	}
+	
 	/**
 	 * @see org.apache.wicket.markup.html.link.ILinkListener#onLinkClicked()
 	 */

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/link/Link.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/Link.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/Link.java
index 413698c..cfc23ec 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/Link.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/Link.java
@@ -18,6 +18,7 @@ package org.apache.wicket.markup.html.link;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.IGenericComponent;
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.Page;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.lambda.WicketConsumer;
@@ -75,7 +76,7 @@ import org.apache.wicket.util.lang.Args;
  * @param <T>
  *            type of model object
  */
-public abstract class Link<T> extends AbstractLink implements ILinkListener, IGenericComponent<T, Link<T>>
+public abstract class Link<T> extends AbstractLink implements IRequestListener, IGenericComponent<T, Link<T>>
 {
 	private static final long serialVersionUID = 1L;
 
@@ -177,6 +178,12 @@ public abstract class Link<T> extends AbstractLink implements ILinkListener, IGe
 	 */
 	public abstract void onClick();
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return true;
+	}
+	
 	/**
 	 * THIS METHOD IS NOT PART OF THE WICKET API. DO NOT ATTEMPT TO OVERRIDE OR CALL IT.
 	 * 
@@ -326,7 +333,7 @@ public abstract class Link<T> extends AbstractLink implements ILinkListener, IGe
 	 */
 	protected CharSequence getURL()
 	{
-		return urlFor(ILinkListener.INTERFACE, new PageParameters());
+		return urlFor(new PageParameters());
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ResourceLink.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ResourceLink.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ResourceLink.java
index b8bbff4..6e8e73d 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ResourceLink.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/ResourceLink.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.markup.html.link;
 
-import org.apache.wicket.IResourceListener;
+import org.apache.wicket.IRequestListener;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
@@ -31,7 +31,7 @@ import org.apache.wicket.request.resource.ResourceReference;
  * @param <T>
  *            type of model object
  */
-public class ResourceLink<T> extends Link<T> implements IResourceListener
+public class ResourceLink<T> extends Link<T> implements IRequestListener
 {
 	private static final long serialVersionUID = 1L;
 
@@ -103,6 +103,12 @@ public class ResourceLink<T> extends Link<T> implements IResourceListener
 	{
 	}
 
+	@Override
+	public boolean includeRenderCount()
+	{
+		return false;
+	}
+	
 	/**
 	 * @see org.apache.wicket.IResourceListener#onResourceRequested()
 	 */
@@ -142,6 +148,6 @@ public class ResourceLink<T> extends Link<T> implements IResourceListener
 			return getRequestCycle().urlFor(
 				new ResourceReferenceRequestHandler(resourceReference, resourceParameters));
 		}
-		return urlFor(IResourceListener.INTERFACE, resourceParameters);
+		return urlFor(resourceParameters);
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/markup/html/link/StatelessLink.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/StatelessLink.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/StatelessLink.java
index 9a4a5c5..62e0581 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/link/StatelessLink.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/link/StatelessLink.java
@@ -50,8 +50,14 @@ public abstract class StatelessLink<T> extends Link<T>
 	}
 
 	@Override
+	public boolean includeRenderCount()
+	{
+		return false;
+	}
+	
+	@Override
 	protected CharSequence getURL()
 	{
-		return urlFor(ILinkListener.INTERFACE, getPage().getPageParameters());
+		return urlFor(getPage().getPageParameters());
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
index e7d582a..8544339 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/BaseWicketTester.java
@@ -40,8 +40,6 @@ import javax.servlet.ServletContext;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpSession;
 
-import junit.framework.AssertionFailedError;
-
 import org.apache.wicket.Application;
 import org.apache.wicket.Component;
 import org.apache.wicket.IPageManagerProvider;
@@ -50,7 +48,6 @@ import org.apache.wicket.IRequestCycleProvider;
 import org.apache.wicket.IRequestListener;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Page;
-import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.Session;
 import org.apache.wicket.ThreadContext;
 import org.apache.wicket.WicketRuntimeException;
@@ -82,12 +79,10 @@ import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.FormComponent;
-import org.apache.wicket.markup.html.form.IFormSubmitListener;
 import org.apache.wicket.markup.html.form.SubmitLink;
 import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.markup.html.link.BookmarkablePageLink;
 import org.apache.wicket.markup.html.link.ExternalLink;
-import org.apache.wicket.markup.html.link.ILinkListener;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.markup.html.link.ResourceLink;
 import org.apache.wicket.markup.html.list.ListView;
@@ -140,6 +135,8 @@ import org.apache.wicket.util.visit.IVisitor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import junit.framework.AssertionFailedError;
+
 /**
  * A helper class to ease unit testing of Wicket applications without the need for a servlet
  * container. See javadoc of <code>WicketTester</code> for example usage. This class can be used as
@@ -1070,7 +1067,7 @@ public class BaseWicketTester
 	{
 		Args.notNull(link, "link");
 
-		Url url = Url.parse(link.urlFor(ILinkListener.INTERFACE, new PageParameters()).toString());
+		Url url = Url.parse(link.urlFor(new PageParameters()).toString());
 		return transform(url).toString();
 	}
 
@@ -1084,14 +1081,14 @@ public class BaseWicketTester
 	 * @param component
 	 * @param listener
 	 */
-	public void executeListener(final Component component, final RequestListenerInterface listener)
+	public void executeListener(final Component component)
 	{
 		Args.notNull(component, "component");
 
 		// there are two ways to do this. RequestCycle could be forced to call the handler
 		// directly but constructing and parsing the URL increases the chance of triggering bugs
 		IRequestHandler handler = new ListenerInterfaceRequestHandler(new PageAndComponentProvider(
-			component.getPage(), component), listener);
+			component.getPage(), component));
 
 		Url url = urlFor(handler);
 		request.setUrl(url);
@@ -1110,39 +1107,19 @@ public class BaseWicketTester
 	 * @param component
 	 * @param listener
 	 */
-	public void invokeListener(final Component component, final RequestListenerInterface listener)
+	public void invokeListener(final Component component)
 	{
 		Args.notNull(component, "component");
 
 		// there are two ways to do this. RequestCycle could be forced to call the handler
 		// directly but constructing and parsing the URL increases the chance of triggering bugs
 		IRequestHandler handler = new ListenerInterfaceRequestHandler(new PageAndComponentProvider(
-			component.getPage(), component), listener);
+			component.getPage(), component));
 
 		processRequest(handler);
 	}
 
 	/**
-	 * Builds and processes a request suitable for invoking a listener. The <code>Component</code>
-	 * must implement any of the known <code>IListener</code> interfaces.
-	 * 
-	 * @param component
-	 *            the listener to invoke
-	 */
-	public void executeListener(final Component component)
-	{
-		Args.notNull(component, "component");
-
-		for (RequestListenerInterface iface : RequestListenerInterface.getRegisteredInterfaces())
-		{
-			if (iface.getListenerInterfaceClass().isAssignableFrom(component.getClass()))
-			{
-				executeListener(component, iface);
-			}
-		}
-	}
-
-	/**
 	 * Builds and processes a request suitable for executing an <code>AbstractAjaxBehavior</code>.
 	 * 
 	 * @param behavior
@@ -1988,7 +1965,7 @@ public class BaseWicketTester
 			}
 			else
 			{
-				executeListener(link, ILinkListener.INTERFACE);
+				executeListener(link);
 			}
 		}
 		// The link requires AJAX
@@ -2029,7 +2006,7 @@ public class BaseWicketTester
 		Form<?> form = (Form<?>)getComponentFromLastRenderedPage(path);
 		Url url = Url.parse(
 			form.getRootForm()
-				.urlFor(IFormSubmitListener.INTERFACE, new PageParameters())
+				.urlFor(new PageParameters())
 				.toString(), Charset.forName(request.getCharacterEncoding()));
 
 		// make url absolute

http://git-wip-us.apache.org/repos/asf/wicket/blob/d1710298/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
index 91c8890..ed18e0e 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/FormTester.java
@@ -35,7 +35,6 @@ import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.markup.html.form.IChoiceRenderer;
 import org.apache.wicket.markup.html.form.IFormSubmittingComponent;
-import org.apache.wicket.markup.html.form.IOnChangeListener;
 import org.apache.wicket.markup.html.form.ListMultipleChoice;
 import org.apache.wicket.markup.html.form.Radio;
 import org.apache.wicket.markup.html.form.RadioGroup;
@@ -517,7 +516,7 @@ public class FormTester
 				boolean wantOnSelectionChangedNotifications = (Boolean)wantOnSelectionChangedNotificationsMethod.invoke(component);
 				if (wantOnSelectionChangedNotifications)
 				{
-					tester.invokeListener(component, IOnChangeListener.INTERFACE);
+					tester.invokeListener(component);
 				}
 			}
 			catch (final Exception x)