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 2021/06/03 12:06:46 UTC

[wicket] branch remove-queuing created (now adbf35e)

This is an automated email from the ASF dual-hosted git repository.

svenmeier pushed a change to branch remove-queuing
in repository https://gitbox.apache.org/repos/asf/wicket.git.


      at adbf35e  removed queuing

This branch includes the following new commits:

     new adbf35e  removed queuing

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[wicket] 01/01: removed queuing

Posted by sv...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

svenmeier pushed a commit to branch remove-queuing
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit adbf35e6176ea69a36e5c7eaf1f514fac99cb91e
Author: Sven Meier <sv...@apache.org>
AuthorDate: Wed Jun 2 23:06:39 2021 +0200

    removed queuing
---
 .../java/org/apache/wicket/ChildToDequeueType.java |   49 -
 .../java/org/apache/wicket/DequeueContext.java     |  301 ------
 .../java/org/apache/wicket/DequeueTagAction.java   |   27 -
 .../main/java/org/apache/wicket/IQueueRegion.java  |   61 --
 .../java/org/apache/wicket/MarkupContainer.java    |  340 ------
 .../src/main/java/org/apache/wicket/Page.java      |    3 +-
 .../apache/wicket/markup/html/border/Border.java   |  147 +--
 .../markup/html/form/FormComponentPanel.java       |    3 +-
 .../apache/wicket/markup/html/panel/Fragment.java  |   17 +-
 .../org/apache/wicket/markup/html/panel/Panel.java |    3 +-
 .../wicket/markup/repeater/AbstractRepeater.java   |   32 +-
 .../apache/wicket/BehavioursDetachTestPage.java    |    2 +-
 .../apache/wicket/OnComponentTagListenerTest.java  |    5 +-
 .../markup/html/border/BorderWithFormPage.java     |   40 -
 .../markup/html/border/ComponentBorderTest.java    |   24 -
 .../markup/html/internal/AjaxEnclosurePage_4.java  |    8 +-
 .../html/internal/ListViewInContainerPage.java     |    4 +-
 .../wicket/markupFragments/MarkupFragmentTest.java |    3 -
 .../queueing/ComponentQueueingPerformanceTest.java |  400 -------
 .../wicket/queueing/ComponentQueueingTest.java     | 1135 --------------------
 .../queueing/transparentresolvers/SubPage.java     |    2 +-
 .../TransparentContainerQueuePage.java             |    2 +-
 .../ajax/builtin/modal/ModalDialogPage.java        |   39 +-
 23 files changed, 41 insertions(+), 2606 deletions(-)

diff --git a/wicket-core/src/main/java/org/apache/wicket/ChildToDequeueType.java b/wicket-core/src/main/java/org/apache/wicket/ChildToDequeueType.java
deleted file mode 100644
index 29cfdfe..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/ChildToDequeueType.java
+++ /dev/null
@@ -1,49 +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;
-
-import org.apache.wicket.markup.html.border.Border;
-
-public enum ChildToDequeueType
-{
-	NULL, GENERIC_COMPONENT, MARKUP_CONTAINER, BORDER, QUEUE_REGION;
-	
-	public static ChildToDequeueType fromChild(Component child) 
-	{
-		if (child == null)
-		{
-			return NULL;
-		}
-		
-		if (child instanceof Border)
-		{
-			return BORDER;
-		}
-		
-		if (child instanceof IQueueRegion)
-		{
-			return QUEUE_REGION;
-		}
-		
-		if (child instanceof MarkupContainer)
-		{
-			return MARKUP_CONTAINER;
-		}
-		
-		return GENERIC_COMPONENT;
-	}
-}
diff --git a/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java b/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java
deleted file mode 100644
index 9c431e9..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/DequeueContext.java
+++ /dev/null
@@ -1,301 +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;
-
-import java.util.ArrayDeque;
-
-import org.apache.wicket.markup.ComponentTag;
-import org.apache.wicket.markup.IMarkupFragment;
-import org.apache.wicket.markup.MarkupElement;
-
-/**
- * Context for component dequeueing. Keeps track of markup position and container stack.
- * 
- * @author igor
- *
- */
-public final class DequeueContext
-{
-	private final IMarkupFragment markup;
-	private int index;
-	private ComponentTag next;
-	private ArrayDeque<ComponentTag> tags = new ArrayDeque<>();
-	private final boolean skipFirst;
-	private ComponentTag first;
-
-	private ArrayDeque<MarkupContainer> containers = new ArrayDeque<>();
-
-	/** A bookmark for the DequeueContext stack */
-	public static final class Bookmark
-	{
-		private final int index;
-		private final ComponentTag next;
-		private final ArrayDeque<ComponentTag> tags;
-		private final ArrayDeque<MarkupContainer> containers;
-
-		private Bookmark(DequeueContext parser)
-		{
-			this.index = parser.index;
-			this.next = parser.next;
-			this.tags = new ArrayDeque<>(parser.tags);
-			this.containers = new ArrayDeque<>(parser.containers);
-		}
-
-		private void restore(DequeueContext parser)
-		{
-			parser.index = index;
-			parser.next = next;
-			parser.tags = new ArrayDeque<>(tags);
-			parser.containers = new ArrayDeque<>(containers);
-		}
-	}
-
-	public DequeueContext(IMarkupFragment markup, MarkupContainer root, boolean skipFirst)
-	{
-		this.markup = markup;
-		this.skipFirst = skipFirst;
-		this.containers.push(root);
-		this.next = nextTag();
-	}
-
-	/**
-	 * Saves the state of the context into a bookmark which can later be used to restore it.
-	 */
-	public Bookmark save()
-	{
-		return new Bookmark(this);
-	}
-
-	/**
-	 * Restores the state of the context from the bookmark
-	 * 
-	 * @param bookmark
-	 */
-	public void restore(Bookmark bookmark)
-	{
-		bookmark.restore(this);
-	}
-
-	/**
-	 * Peeks markup tag that would be retrieved by call to {@link #takeTag()}
-	 * 
-	 * @return
-	 */
-	public ComponentTag peekTag()
-	{
-		return next;
-	}
-
-	/**
-	 * Retrieves the next markup tag
-	 * 
-	 * @return
-	 */
-	public ComponentTag takeTag()
-	{
-		ComponentTag taken = next;
-
-		if (taken == null)
-		{
-			return null;
-		}
-
-		if (taken.isOpen() && !taken.hasNoCloseTag())
-		{
-			tags.push(taken);
-		}
-		else if (tags.size() > 0 && taken.closes(tags.peek()))
-		{
-			tags.pop();
-		}
-		next = nextTag();
-		return taken;
-	}
-
-	/**
-	 * Skips to the closing tag of the tag retrieved from last call to {@link #takeTag()}
-	 */
-	public void skipToCloseTag()
-	{
-		while (!next.closes(tags.peek()))
-		{
-			next = nextTag();
-		}
-	}
-
-	private ComponentTag nextTag()
-	{
-		if (skipFirst && first == null)
-		{
-			for (; index < markup.size(); index++)
-			{
-				MarkupElement element = markup.get(index);
-				if (element instanceof ComponentTag)
-				{
-					first = (ComponentTag)element;
-					index++;
-					break;
-				}
-			}
-		}
-
-		for (; index < markup.size(); index++)
-		{
-			MarkupElement element = markup.get(index);
-			if (element instanceof ComponentTag)
-			{
-				ComponentTag tag = (ComponentTag)element;
-
-				if (tag.isOpen() || tag.isOpenClose())
-				{
-					DequeueTagAction action = canDequeueTag(tag);
-					switch (action)
-					{
-						case IGNORE :
-							continue;
-						case DEQUEUE :
-							index++;
-							return tag;
-						case SKIP : // skip to close tag
-							boolean found = false;
-							for (; index < markup.size(); index++)
-							{
-								if ((markup.get(index) instanceof ComponentTag)
-									&& markup.get(index).closes(tag))
-								{
-									found = true;
-									break;
-								}
-							}
-							if (!found)
-							{
-								throw new IllegalStateException(String.format(
-									"Could not find close tag for tag '%s' in markup: %s ", tag,
-									markup));
-							}
-
-					}
-				}
-				else
-				{
-					// closed tag
-					ComponentTag open = tag.isClose() ? tag.getOpenTag() : tag;
-
-					if (skipFirst && first != null && open == first)
-					{
-						continue;
-					}
-
-					switch (canDequeueTag(open))
-					{
-						case DEQUEUE :
-							index++;
-							return tag;
-						case IGNORE :
-							continue;
-						case SKIP :
-							throw new IllegalStateException(String.format(
-								"Should not see closed tag of skipped open tag '%s' in markup:%s",
-								tag, markup));
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	private DequeueTagAction canDequeueTag(ComponentTag open)
-	{
-		if (containers.size() < 1)
-		{
-			// TODO queueing message: called too early
-			throw new IllegalStateException();
-		}
-
-		DequeueTagAction action;
-		for (MarkupContainer container : containers)
-		{
-			action = container.canDequeueTag(open);
-			if (action != null)
-			{
-				return action;
-			}
-		}
-		return DequeueTagAction.IGNORE;
-	}
-
-	/**
-	 * Checks if the tag returned by {@link #peekTag()} is either open or open-close.
-	 * 
-	 * @return
-	 */
-	public boolean isAtOpenOrOpenCloseTag()
-	{
-		ComponentTag tag = peekTag();
-		return tag != null && (tag.isOpen() || tag.isOpenClose());
-	}
-
-	/**
-	 * Retrieves the container on the top of the containers stack
-	 * 
-	 * @return
-	 */
-	public MarkupContainer peekContainer()
-	{
-		return containers.peek();
-	}
-
-	/**
-	 * Pushes a container onto the container stack
-	 * 
-	 * @param container
-	 */
-	public void pushContainer(MarkupContainer container)
-	{
-		containers.push(container);
-	}
-
-	/**
-	 * Pops a container from the container stack
-	 * 
-	 * @return
-	 */
-	public MarkupContainer popContainer()
-	{
-		return containers.pop();
-	}
-
-	/**
-	 * Searches the container stack for a component that can be dequeude
-	 * 
-	 * @param tag
-	 * @return
-	 */
-	public Component findComponentToDequeue(ComponentTag tag)
-	{
-		for (MarkupContainer container : containers)
-		{
-			Component child = container.findComponentToDequeue(tag);
-			if (child != null)
-			{
-				return child;
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/wicket-core/src/main/java/org/apache/wicket/DequeueTagAction.java b/wicket-core/src/main/java/org/apache/wicket/DequeueTagAction.java
deleted file mode 100644
index 461cac4..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/DequeueTagAction.java
+++ /dev/null
@@ -1,27 +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;
-
-public enum DequeueTagAction
-{
-	/** dequeue the tag */
-	DEQUEUE,
-	/** skip this tag and all its children */
-	SKIP,
-	/** ignore this tag, skip it but do not skip its children */
-	IGNORE;
-}
diff --git a/wicket-core/src/main/java/org/apache/wicket/IQueueRegion.java b/wicket-core/src/main/java/org/apache/wicket/IQueueRegion.java
deleted file mode 100644
index b6ef154..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/IQueueRegion.java
+++ /dev/null
@@ -1,61 +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;
-
-import org.apache.wicket.markup.IMarkupFragment;
-
-
-/**
- * Demarcates components that act as a root can dequeue children. These are usually components with
- * associated markup since the markup is needed to dequeue.
- * 
- * It is also important to note that components queued outside of a region cannot be dequeued into
- * it since regions act as roots for the dequeue process because they contain the markup. As such,
- * for example, a component queued in a page cannot be dequeued into a page child that is a panel
- * because a panel is an {@link IQueueRegion}.
- * 
- * @author igor
- * 
- */
-public interface IQueueRegion
-{
-	/**
-	 * Creates a new {@link DequeueContext} that will be used to dequeue children of this region.
-	 * 
-	 * Usually containers will create a context with their associated markup by getting it via
-	 * {@link MarkupContainer#getAssociatedMarkup()}, but components that do not render markup in a
-	 * standard way (such as repeaters and borders) may choose to override this method to implement
-	 * custom behavior for the dequeueing process.
-	 */
-	DequeueContext newDequeueContext();
-
-	/**
-	 * Starts component dequeueing on this {@link IQueueRegion}. This is the entry point into the
-	 * dequeuing process, it creates the {@link DequeueContext} and delegates the operation to the
-	 * {@link org.apache.wicket.MarkupContainer#dequeue(DequeueContext)} method which performs the
-	 * actual dequeueing. The context's markup is retrieved using the {@link MarkupContainer#getAssociatedMarkup()}.
-	 */
-	void dequeue();
-	
-	/**
-	 * Returns the markup to use for queuing. Normally, this is the markup of the component 
-	 * implementing this interface.
-	 * 
-	 * @return the markup to use for queuing
-	 */
-	IMarkupFragment getRegionMarkup();
-}
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 3cb4ce9..580e86e 100644
--- a/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/MarkupContainer.java
@@ -1780,186 +1780,6 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp
 
 		modCounter++;
 		removals_clear();
-
-		if (queue != null && !queue.isEmpty() && hasBeenRendered())
-		{
-			throw new WicketRuntimeException(
-					String.format("Detach called on component with id '%s' while it had a non-empty queue: %s",
-							getId(), queue));
-		}
-	}
-
-	private transient ComponentQueue queue;
-
-	/**
-	 * Queues one or more components to be dequeued later. The advantage of this method over the
-	 * {@link #add(Component...)} method is that the component does not have to be added to its
-	 * direct parent, only to a parent upstream; it will be dequeued into the correct parent using
-	 * the hierarchy defined in the markup. This allows the component hierarchy to be maintained only
-	 * in markup instead of in markup and in java code; affording designers and developers more
-	 * freedom when moving components in markup.
-	 * 
-	 * @param components
-	 *             the components to queue
-	 * @return {@code this} for method chaining             
-	 */
-	public MarkupContainer queue(Component... components)
-	{
-		if (queue == null)
-		{
-			queue = new ComponentQueue();
-		}
-		queue.add(components);
-		
-		Page page = findPage();
-
-		if (page != null)
-		{
-			dequeue();			
-		}
-
-		return this;
-	}
-
-	/**
-	 * @see IQueueRegion#dequeue()
-	 */
-	public void dequeue()
-	{
-		if (this instanceof IQueueRegion)
-		{
-			DequeueContext dequeue = newDequeueContext();
-			dequeuePreamble(dequeue);
-		}
-		else
-		{
-			MarkupContainer queueRegion = (MarkupContainer)findParent(IQueueRegion.class);
-
-			if (queueRegion == null)
-			{
-				return;
-			}
-			
-			MarkupContainer anchestor = this;
-			boolean hasQueuedChildren = !isQueueEmpty();
-			
-			while (!hasQueuedChildren && anchestor != queueRegion)
-			{
-				anchestor = anchestor.getParent();
-				hasQueuedChildren = !anchestor.isQueueEmpty();
-			}
-			
-			if (hasQueuedChildren && !queueRegion.getRequestFlag(RFLAG_CONTAINER_DEQUEING))
-			{
-				queueRegion.dequeue();
-			}
-		}
-	}
-
-	@Override
-	protected void onInitialize()
-	{
-		super.onInitialize();
-		dequeue();
-	}
-	/**
-	 * @return {@code true} when one or more components are queued
-	 */
-	private boolean isQueueEmpty()
-	{
-		return queue == null || queue.isEmpty();
-	}
-
-	/**
-	 * @return {@code true} when this markup container is a queue region
-	 */
-	private boolean isQueueRegion() 
-	{
-		return IQueueRegion.class.isInstance(this);
-	}
-
-	/**
-	 * Run preliminary operations before running {@link #dequeue(DequeueContext)}. More in detail it
-	 * throws an exception if the container is already dequeuing, and it also takes care of setting
-	 * flag {@code RFLAG_CONTAINER_DEQUEING} to true before running {@link #dequeue(DequeueContext)}
-	 * and setting it back to false after dequeuing is completed.
-	 * 
-	 * @param dequeue
-	 *            the dequeue context to use
-	 */
-	protected void dequeuePreamble(DequeueContext dequeue)
-	{
-		if (getRequestFlag(RFLAG_CONTAINER_DEQUEING))
-		{
-			throw new IllegalStateException("This container is already dequeing: " + this);
-		}
-
-		setRequestFlag(RFLAG_CONTAINER_DEQUEING, true);
-		try
-		{
-			if (dequeue == null)
-			{
-				return;
-			}
-
-			if (dequeue.peekTag() != null)
-			{
-				dequeue(dequeue);
-			}
-		}
-		finally
-		{
-			setRequestFlag(RFLAG_CONTAINER_DEQUEING, false);
-		}
-	}
-
-	/**
-	 * Dequeues components. The default implementation iterates direct children of this container
-	 * found in its markup and tries to find matching
-	 * components in queues filled by a call to {@link #queue(Component...)}. It then delegates the
-	 * dequeueing to these children.
-	 * 
-	 * 
-	 * Certain components that implement custom markup behaviors (such as repeaters and borders)
-	 * override this method to bring dequeueing in line with their custom markup handling.
-	 * 
-	 * @param dequeue
-	 *             the dequeue context to use     
-	 */
-	public void dequeue(DequeueContext dequeue)
-	{
-		while (dequeue.isAtOpenOrOpenCloseTag())
-		{
-			ComponentTag tag = dequeue.takeTag();
-	
-			// see if child is already added to parent
-			Component child = findChildComponent(tag);
-
-			if (child == null)
-			{
-				// the container does not yet have a child with this id, see if we can
-				// dequeue
-				child = dequeue.findComponentToDequeue(tag);
-				
-				//if tag has an autocomponent factory let's use it
-				if (child == null && tag.getAutoComponentFactory() != null)
-				{
-					IAutoComponentFactory autoComponentFactory = tag.getAutoComponentFactory();
-					child = autoComponentFactory.newComponent(this, tag);
-				}
-				
-				if (child != null)
-				{
-					addDequeuedComponent(child, tag);
-				}
-			}
-			
-			if (tag.isOpen() && !tag.hasNoCloseTag())
-            {
-			    dequeueChild(child, tag, dequeue);
-            }
-		}
-
 	}
 
 	/**
@@ -1974,81 +1794,6 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp
 		return get(tag.getId());
 	}
 	
-	/**
-	 * Propagates dequeuing to child component.
-	 * 
-	 * @param child
-	 *             the child component
-	 * @param tag
-	 *             the child tag
-	 * @param dequeue
-	 *             the dequeue context to use
-	 */
-	private void dequeueChild(Component child, ComponentTag tag, DequeueContext dequeue)
-	{
-		ChildToDequeueType childType = ChildToDequeueType.fromChild(child);
-		
-		if (childType == ChildToDequeueType.QUEUE_REGION ||
-			childType == ChildToDequeueType.BORDER)
-		{
-			((IQueueRegion)child).dequeue();			
-		}
-		
-		if (childType == ChildToDequeueType.BORDER) 
-		{
-            Border childContainer = (Border)child;
-            // propagate dequeuing to border's body
-            MarkupContainer body = childContainer.getBodyContainer();
-
-            dequeueChildrenContainer(dequeue, body);
-		}
-		
-		if (childType == ChildToDequeueType.MARKUP_CONTAINER)
-		{
-            // propagate dequeuing to containers
-            MarkupContainer childContainer = (MarkupContainer)child;
-
-            dequeueChildrenContainer(dequeue, childContainer);			
-		}
-		
-		if (childType == ChildToDequeueType.NULL || 
-			childType == ChildToDequeueType.QUEUE_REGION)
-		{
-			dequeue.skipToCloseTag();
-		}
-
-		// pull the close tag off
-		ComponentTag close = dequeue.takeTag();
-		do
-		{
-			if (close != null && close.closes(tag))
-			{
-				return;
-			}
-		} while ((close = dequeue.takeTag()) != null);
-
-		throw new IllegalStateException(String.format("Could not find the closing tag for '%s'", tag));
-	}
-
-    private void dequeueChildrenContainer(DequeueContext dequeue, MarkupContainer child)
-    {
-        dequeue.pushContainer(child);
-        child.dequeue(dequeue);
-        dequeue.popContainer();
-    }
-
-    /** @see IQueueRegion#newDequeueContext() */
-	public DequeueContext newDequeueContext()
-	{
-		IMarkupFragment markup = getRegionMarkup();
-		if (markup == null)
-		{
-			return null;
-		}
-
-		return new DequeueContext(markup, this, false);
-	}
-
 	/** @see IQueueRegion#getRegionMarkup() */
 	public IMarkupFragment getRegionMarkup()
 	{
@@ -2056,91 +1801,6 @@ public abstract class MarkupContainer extends Component implements Iterable<Comp
 	}
 
 	/**
-	 * Checks if this container can dequeue a child represented by the specified tag. This method
-	 * should be overridden when containers can dequeue components represented by non-standard tags.
-	 * For example, borders override this method and dequeue their body container when processing
-	 * the body tag.
-	 * 
-	 * By default all {@link ComponentTag}s are supported as well as {@link WicketTag}s that return
-	 * a non-null value from {@link WicketTag#getAutoComponentFactory()} method.
-	 * 
-	 * @param tag
-	 */
-	protected DequeueTagAction canDequeueTag(ComponentTag tag)
-	{
-		if (tag instanceof WicketTag)
-		{
-			WicketTag wicketTag = (WicketTag)tag;
-			if (wicketTag.isContainerTag())
-			{
-				return DequeueTagAction.DEQUEUE;
-			}
-			else if (wicketTag.getAutoComponentFactory() != null)
-			{
-				return DequeueTagAction.DEQUEUE;
-			}
-			else if (wicketTag.isFragmentTag())
-			{
-				return DequeueTagAction.SKIP;
-			}
-			else if (wicketTag.isChildTag())
-			{
-				return DequeueTagAction.IGNORE;
-			}
-			else if (wicketTag.isHeadTag())
-			{
-				return DequeueTagAction.SKIP;
-			}
-			else if (wicketTag.isLinkTag())
-			{
-				return DequeueTagAction.DEQUEUE;
-			}
-			else
-			{
-				return null; // don't know
-			}
-		}
-		
-		//if is a label tag, ignore it
-		if (tag.isAutoComponentTag() 
-			&& tag.getId().startsWith(AutoLabelResolver.LABEL_ATTR))
-		{
-			return DequeueTagAction.IGNORE;
-		}
-		
-		return DequeueTagAction.DEQUEUE;
-	}
-
-	/**
-	 * Queries this container to find a child that can be dequeued that matches the specified tag.
-	 * The default implementation will check if there is a component in the queue that has the same
-	 * id as a tag, but sometimes custom tags can be dequeued and in those situations this method
-	 * should be overridden.
-	 * 
-	 * @param tag
-	 * @return
-	 */
-	public Component findComponentToDequeue(ComponentTag tag)
-	{
-		return queue == null ? null : queue.remove(tag.getId());
-	}
-
-	/**
-	 * Adds a dequeued component to this container. This method should rarely be overridden because
-	 * the common case of simply forwarding the component to
-	 * {@link MarkupContainer#add(Component...))} method should cover most cases. Components that
-	 * implement a custom hierarchy, such as borders, may wish to override it to support edge-case
-	 * non-standard behavior.
-	 * 
-	 * @param component
-	 * @param tag
-	 */
-	protected void addDequeuedComponent(Component component, ComponentTag tag)
-	{
-		add(component);
-	}
-
-	/**
 	 * Returns a sequential {@code Stream} with the direct children of this markup container as its
 	 * source. This stream doesn't traverse the component tree.
 	 *
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 d204335..180bc54 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Page.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Page.java
@@ -84,8 +84,7 @@ import org.slf4j.LoggerFactory;
  */
 public abstract class Page extends MarkupContainer
 	implements
-		IRequestablePage,
-		IQueueRegion
+		IRequestablePage
 {
 	/** True if the page hierarchy has been modified in the current request. */
 	private static final int FLAG_IS_DIRTY = FLAG_RESERVED3;
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
index 7edf2d8..6189bf3 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/border/Border.java
@@ -17,9 +17,6 @@
 package org.apache.wicket.markup.html.border;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.DequeueContext;
-import org.apache.wicket.DequeueTagAction;
-import org.apache.wicket.IQueueRegion;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.IMarkupFragment;
@@ -28,8 +25,6 @@ import org.apache.wicket.markup.MarkupException;
 import org.apache.wicket.markup.MarkupFragment;
 import org.apache.wicket.markup.MarkupStream;
 import org.apache.wicket.markup.TagUtils;
-import org.apache.wicket.markup.WicketTag;
-import org.apache.wicket.markup.html.MarkupUtil;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.panel.BorderMarkupSourcingStrategy;
 import org.apache.wicket.markup.html.panel.IMarkupSourcingStrategy;
@@ -137,7 +132,7 @@ import org.apache.wicket.util.lang.Args;
  * @author Jonathan Locke
  * @author Juergen Donnerstag
  */
-public abstract class Border extends WebMarkupContainer implements IComponentResolver, IQueueRegion
+public abstract class Border extends WebMarkupContainer implements IComponentResolver
 {
 	private static final long serialVersionUID = 1L;
 
@@ -166,7 +161,7 @@ public abstract class Border extends WebMarkupContainer implements IComponentRes
 		super(id, model);
 
 		body = new BorderBodyContainer(id + "_" + BODY);
-		queueToBorder(body);
+		addToBorder(body);
 	}
 	
 	/**
@@ -313,33 +308,6 @@ public abstract class Border extends WebMarkupContainer implements IComponentRes
 		return this;
 	}
 
-	@Override
-	public Border queue(Component... components)
-	{
-		getBodyContainer().queue(components);
-		return this;
-	}
-	
-	@Override
-	protected void onConfigure() 
-	{
-		super.onConfigure();
-		dequeue();
-	}
-	
-	/**
-	 * Queues children components to the Border itself
-	 *
-	 * @param children
-	 *            the children components to queue
-	 * @return this
-	 */
-	public Border queueToBorder(final Component... children)
-	{
-		super.queue(children);
-		return this;
-	}
-
 	/**
 	 * Removes child from the Border itself
 	 * 
@@ -455,7 +423,7 @@ public abstract class Border extends WebMarkupContainer implements IComponentRes
 	/**
 	 * The container to be associated with the &lt;wicket:body&gt; tag
 	 */
-	public class BorderBodyContainer extends WebMarkupContainer implements IQueueRegion
+	public class BorderBodyContainer extends WebMarkupContainer
 	{
 		private static final long serialVersionUID = 1L;
 
@@ -592,112 +560,5 @@ public abstract class Border extends WebMarkupContainer implements IComponentRes
 
 			return markup.find(child.getId());
 		}
-
-		@Override
-		public DequeueContext newDequeueContext()
-		{
-			Border border = findParent(Border.class);
-			IMarkupFragment fragment = border.getMarkup();
-
-			if (fragment == null)
-			{
-				return null;
-			}
-
-			return new DequeueContext(fragment, this, true);
-		}
-
-		@Override
-		public Component findComponentToDequeue(ComponentTag tag)
-		{
-			/*
-			 * the body container is allowed to search for queued components all
-			 * the way to the page even though it is an IQueueRegion so it can
-			 * find components queued below the border
-			 */
-
-			Component component = super.findComponentToDequeue(tag);
-			if (component != null)
-			{
-				return component;
-			}
-
-			MarkupContainer cursor = getParent();
-			while (cursor != null)
-			{
-				component = cursor.findComponentToDequeue(tag);
-				if (component != null)
-				{
-					return component;
-				}
-				if (cursor instanceof BorderBodyContainer)
-				{
-					// optimization - find call above would've already recursed
-					// to page
-					break;
-				}
-				cursor = cursor.getParent();
-			}
-			return null;
-		}
-	}
-
-	@Override
-	protected DequeueTagAction canDequeueTag(ComponentTag tag)
-	{
-		if (canDequeueBody(tag))
-		{
-			return DequeueTagAction.DEQUEUE;
-		}
-
-		return super.canDequeueTag(tag);
-	}
-
-	@Override
-	public Component findComponentToDequeue(ComponentTag tag)
-	{
-		if (canDequeueBody(tag))
-		{
-			//synch the tag id with the one of the body component
-			tag.setId(body.getId());
-		}
-		
-		return super.findComponentToDequeue(tag);
-	}
-
-	private boolean canDequeueBody(ComponentTag tag)
-	{
-		boolean isBodyTag = (tag instanceof WicketTag) && ((WicketTag)tag).isBodyTag();
-		
-		return isBodyTag;
-	}
-
-	@Override
-	protected void addDequeuedComponent(Component component, ComponentTag tag)
-	{
-		// components queued in border get dequeued into the border not into the body container
-		super.add(component);
-	}
-	
-	/**
-	 * Returns the markup inside &lt;wicket:border&gt; tag.
-	 * If such tag is not found, all the markup is returned.
-	 * 
-	 * @see IQueueRegion#getRegionMarkup() 
-	 */
-	@Override
-	public IMarkupFragment getRegionMarkup()
-	{
-		IMarkupFragment markup = super.getRegionMarkup();
-		
-		if (markup == null)
-		{
-			return markup;
-		}
-		
-		IMarkupFragment borderMarkup = MarkupUtil.findStartTag(markup, BORDER);
-		
-		return borderMarkup != null ? borderMarkup : markup;
 	}
-	
-}
+}
\ No newline at end of file
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentPanel.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentPanel.java
index c85772a..c589957 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentPanel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponentPanel.java
@@ -16,7 +16,6 @@
  */
 package org.apache.wicket.markup.html.form;
 
-import org.apache.wicket.IQueueRegion;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.panel.IMarkupSourcingStrategy;
 import org.apache.wicket.markup.html.panel.PanelMarkupSourcingStrategy;
@@ -109,7 +108,7 @@ import org.apache.wicket.util.visit.IVisitor;
  * @param <T>
  *            The model object type
  */
-public abstract class FormComponentPanel<T> extends FormComponent<T> implements IQueueRegion
+public abstract class FormComponentPanel<T> extends FormComponent<T>
 {
 	private static final long serialVersionUID = 1L;
 
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/panel/Fragment.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/panel/Fragment.java
index 25e9b10..3b3ae58 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/panel/Fragment.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/panel/Fragment.java
@@ -17,8 +17,6 @@
 package org.apache.wicket.markup.html.panel;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.DequeueContext;
-import org.apache.wicket.IQueueRegion;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.IMarkupFragment;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -48,7 +46,7 @@ import org.apache.wicket.util.lang.Args;
  * 
  * @author Juergen Donnerstag
  */
-public class Fragment extends WebMarkupContainer implements IQueueRegion
+public class Fragment extends WebMarkupContainer
 {
 	private static final long serialVersionUID = 1L;
 
@@ -131,17 +129,4 @@ public class Fragment extends WebMarkupContainer implements IQueueRegion
 	{
 		return associatedMarkupId;
 	}
-
-
-	@Override
-	public DequeueContext newDequeueContext()
-	{
-		IMarkupFragment markup = getMarkupSourcingStrategy().getMarkup(this, null);
-		if (markup == null)
-		{
-			return null;
-		}
-
-		return new DequeueContext(markup, this, true);
-	}
 }
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/panel/Panel.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/panel/Panel.java
index 1520c07..8b3817c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/panel/Panel.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/panel/Panel.java
@@ -16,7 +16,6 @@
  */
 package org.apache.wicket.markup.html.panel;
 
-import org.apache.wicket.IQueueRegion;
 import org.apache.wicket.markup.IMarkupFragment;
 import org.apache.wicket.markup.html.MarkupUtil;
 import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -52,7 +51,7 @@ import org.apache.wicket.model.IModel;
  * @author Jonathan Locke
  * @author Juergen Donnerstag
  */
-public abstract class Panel extends WebMarkupContainer implements IQueueRegion
+public abstract class Panel extends WebMarkupContainer
 {
 	private static final long serialVersionUID = 1L;
 
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/repeater/AbstractRepeater.java b/wicket-core/src/main/java/org/apache/wicket/markup/repeater/AbstractRepeater.java
index 25e320a..3ea03ea 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/repeater/AbstractRepeater.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/repeater/AbstractRepeater.java
@@ -21,9 +21,6 @@ import java.util.Iterator;
 import java.util.Set;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.DequeueContext;
-import org.apache.wicket.DequeueContext.Bookmark;
-import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.IMarkupFragment;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.model.IModel;
@@ -158,31 +155,4 @@ public abstract class AbstractRepeater extends WebMarkupContainer
 	 */
 	protected abstract void onPopulate();
 
-	@Override
-	public void dequeue(DequeueContext dequeue)
-	{
-		if (size() > 0)
-		{
-			// essentially what we do is for every child replace the repeater with the child in
-			// dequeue container stack and run the dequeue on the child. we also take care to reset
-			// the state of the dequeue context after we process every child.
-
-			Bookmark bookmark = dequeue.save();
-
-			for (Component child : this)
-			{
-				if (child instanceof MarkupContainer)
-				{
-					dequeue.popContainer(); // pop the repeater
-					MarkupContainer container = (MarkupContainer) child;
-					dequeue.pushContainer(container);
-					container.dequeue(dequeue);
-					dequeue.restore(bookmark);
-				}
-			}
-		}
-
-		dequeue.skipToCloseTag();
-
-	}
-}
+}
\ No newline at end of file
diff --git a/wicket-core/src/test/java/org/apache/wicket/BehavioursDetachTestPage.java b/wicket-core/src/test/java/org/apache/wicket/BehavioursDetachTestPage.java
index 82b8f73..75b2923 100644
--- a/wicket-core/src/test/java/org/apache/wicket/BehavioursDetachTestPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/BehavioursDetachTestPage.java
@@ -39,7 +39,7 @@ public class BehavioursDetachTestPage extends WebPage {
             @Override
             public void onClick() {/*NoOp*/}
         };
-        queue(link);
+        add(link);
 
         // A behavior that causes the problem
         link.add(new VisibilityBehavior());
diff --git a/wicket-core/src/test/java/org/apache/wicket/OnComponentTagListenerTest.java b/wicket-core/src/test/java/org/apache/wicket/OnComponentTagListenerTest.java
index 0a588a0..1c57571 100644
--- a/wicket-core/src/test/java/org/apache/wicket/OnComponentTagListenerTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/OnComponentTagListenerTest.java
@@ -102,13 +102,14 @@ class OnComponentTagListenerTest extends WicketTestCase {
 	static class TestPage extends WebPage implements IMarkupResourceStreamProvider {
 		private static final long serialVersionUID = 1L;
 
-		private Component c1, c2, c3;
+		private WebMarkupContainer c1, c2, c3;
 
 		TestPage() {
 			c1 = new WebMarkupContainer("c1");
 			c2 = new WebMarkupContainer("c2");
 			c3 = new WebMarkupContainer("c3");
-			queue(c1, c2, c3);
+			add(c1, c3);
+			c1.add(c2);
 		}
 
 		@Override
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/BorderWithFormPage.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/border/BorderWithFormPage.java
deleted file mode 100644
index e48567c..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/BorderWithFormPage.java
+++ /dev/null
@@ -1,40 +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.border;
-
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.IModel;
-
-public class BorderWithFormPage extends WebPage {
-	private static final long serialVersionUID = 1L;
-	private TextField<String> field;
-
-	public BorderWithFormPage(IModel<String> model) {
-		super();
-		
-		WebMarkupContainer container = new WebMarkupContainer("borderContainer");
-		
-		BorderWithForm border = new BorderWithForm("formBorder");
-		
-		border.add(field = new TextField<>("text", model));
-		
-		container.add(border);
-		add(container);
-    }
-}
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/ComponentBorderTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/border/ComponentBorderTest.java
index 51c1f63..b805762 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/border/ComponentBorderTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/border/ComponentBorderTest.java
@@ -89,30 +89,6 @@ class ComponentBorderTest extends WicketTestCase
 	}
 
 	@Test
-	void borderWithForm() throws Exception
-	{
-		/*
-		 * Suppose we have a border like this:
-		 * 
-		 * <div wicket:id="border"> <form> <body/> </form> </div>
-		 * 
-		 * Any form components inside its body must be correctly submitted with the outer form.
-		 */
-		Model<String> model = Model.of("");
-		BorderWithFormPage page = new BorderWithFormPage(model);
-
-		tester.startPage(page);
-
-		FormTester formTester = tester
-			.newFormTester("borderContainer:formBorder:borderContainer:form");
-
-		formTester.setValue("formBorder_body:text", TEST_TEXT);
-		formTester.submit();
-
-		assertEquals(TEST_TEXT, model.getObject());
-	}
-
-	@Test
 	void borderWithEnclosurePage() throws Exception
 	{
 		tester.startPage(BorderWithEnclosurePage.class);
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/AjaxEnclosurePage_4.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/AjaxEnclosurePage_4.java
index bdeb27d..51fec72 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/AjaxEnclosurePage_4.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/AjaxEnclosurePage_4.java
@@ -17,10 +17,8 @@
 package org.apache.wicket.markup.html.internal;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
 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.TextField;
 import org.apache.wicket.model.PropertyModel;
@@ -49,14 +47,14 @@ public class AjaxEnclosurePage_4 extends WebPage
 	{
 
 		Form<?> form=new Form<Void>("form");
-		queue(form);
+		add(form);
 		
 		//nameLabel=new Label("nameLabel", "Name");
 		//queue(nameLabel);
 		
 		nameField=new TextField<String>("nameField", new PropertyModel<String>(this, "name"));
 		nameField.setOutputMarkupId(true);
-		queue(nameField);
+		form.add(nameField);
 
 		submit=new AjaxSubmitLink("submit") {
 			@Override
@@ -66,7 +64,7 @@ public class AjaxEnclosurePage_4 extends WebPage
 				target.add(nameField);
 			}
 		};
-		queue(submit);
+		form.add(submit);
 		
 	}
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/ListViewInContainerPage.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/ListViewInContainerPage.java
index cb9787f..ee38514 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/ListViewInContainerPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/ListViewInContainerPage.java
@@ -50,10 +50,10 @@ public class ListViewInContainerPage extends BasePage
 			protected void populateItem(final ListItem<Integer> item)
 			{
 				final Label testenc = new Label("testenc", Model.of("enclosure " + item.getModelObject()));
-				item.queue(testenc);
+				item.add(testenc);
 
 				final Label testlib = new Label("testlib", Model.of("no enclosure " + item.getModelObject()));
-				item.queue(testlib);
+				item.add(testlib);
 			}
 		});
     }
diff --git a/wicket-core/src/test/java/org/apache/wicket/markupFragments/MarkupFragmentTest.java b/wicket-core/src/test/java/org/apache/wicket/markupFragments/MarkupFragmentTest.java
index 1a2a86f..78c54d4 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markupFragments/MarkupFragmentTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markupFragments/MarkupFragmentTest.java
@@ -180,7 +180,6 @@ class MarkupFragmentTest extends WicketTestCase
 
 		assertNull(border.getBodyContainer().getAssociatedMarkup());
 
-		border.dequeue();
 		markup = border.getBodyContainer().getMarkup();
 		compareMarkupWithString(markup, "<wicket:body/>");
 
@@ -220,8 +219,6 @@ class MarkupFragmentTest extends WicketTestCase
 
 		assertNull(border.getBodyContainer().getAssociatedMarkup());
 
-		// See explanation in BaseBorder.BorderBodyContainer.getMarkup()
-		border.dequeue();
 		markup = border.getBodyContainer().getParent().getMarkup(border.getBodyContainer());
 		compareMarkupWithString(markup, "<wicket:body>333</wicket:body>");
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingPerformanceTest.java b/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingPerformanceTest.java
deleted file mode 100644
index 722478e..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingPerformanceTest.java
+++ /dev/null
@@ -1,400 +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.queueing;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.UUID;
-
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.Page;
-import org.apache.wicket.markup.IMarkupResourceStreamProvider;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.markup.repeater.Item;
-import org.apache.wicket.markup.repeater.RefreshingView;
-import org.apache.wicket.markup.repeater.util.ModelIteratorAdapter;
-import org.apache.wicket.mock.MockApplication;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.LoadableDetachableModel;
-import org.apache.wicket.model.PropertyModel;
-import org.apache.wicket.util.WicketTestTag;
-import org.apache.wicket.util.resource.IResourceStream;
-import org.apache.wicket.util.resource.StringResourceStream;
-import org.apache.wicket.util.tester.WicketTestCase;
-import org.apache.wicket.util.tester.WicketTester;
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-
-@Tag(WicketTestTag.SLOW)
-public class ComponentQueueingPerformanceTest extends WicketTestCase
-{
-	private void run(Class<? extends Page> pageClass)
-	{
-		WicketTester tester = new WicketTester(new MockApplication());
-		try
-		{
-			tester.startPage(pageClass);
-		}
-		finally
-		{
-			tester.destroy();
-		}
-	}
-
-	@Test
-	void performance()
-	{
-		final int warmup = 30;
-		final int performance = 60;
-
-		tester.startPage(AddContactsPage.class);
-
-		for (int i = 0; i < warmup; i++)
-		{
-			run(AddContactsPage.class);
-		}
-		long start = System.currentTimeMillis();
-		for (int i = 0; i < performance; i++)
-		{
-			run(AddContactsPage.class);
-		}
-		long end = System.currentTimeMillis();
-		long addDuration = end - start;
-
-		for (int i = 0; i < warmup; i++)
-		{
-			run(QueueContactsPage.class);
-		}
-		start = System.currentTimeMillis();
-		for (int i = 0; i < performance; i++)
-		{
-			run(QueueContactsPage.class);
-		}
-		end = System.currentTimeMillis();
-		long queueDuration = end - start;
-
-
-		System.out.println("add duration: " + addDuration + " queue duration: " + queueDuration);
-
-	}
-
-
-	@Test
-	void consistency()
-	{
-		tester.startPage(new QueueContactsPage());
-		String queue = tester.getLastResponseAsString();
-		tester.startPage(new AddContactsPage());
-		String add = tester.getLastResponseAsString();
-		assertEquals(queue, add);
-	}
-
-	private static class PhoneNumber
-	{
-		String id = UUID.randomUUID().toString();
-		String areacode = "234";
-		String prefix = "342";
-		String suffix = "3423";
-	}
-
-	private static class Address
-	{
-		String id = UUID.randomUUID().toString();
-		String street = "2343 Jsdfjsf St.";
-		String city = "Ksdfjsfs";
-		String state = "AS";
-		String zipcode = "32434";
-	}
-
-	private static class Contact
-	{
-		String id = UUID.randomUUID().toString();
-		String first = "Jlkjsf";
-		String last = "Kjwieojkjf";
-		Address address = new Address();
-		PhoneNumber work = new PhoneNumber();
-		PhoneNumber cell = new PhoneNumber();
-
-	}
-
-	private static Store store = new Store();
-
-	private static class Store
-	{
-		Map<String, PhoneNumber> phones = new HashMap<String, PhoneNumber>();
-		Map<String, Address> addresses = new HashMap<String, Address>();
-		Map<String, Contact> contacts = new HashMap<String, Contact>();
-
-		public <T> T get(Class<T> clazz, String id)
-		{
-			if (PhoneNumber.class.equals(clazz))
-			{
-				return (T)phones.get(id);
-			}
-			else if (Address.class.equals(clazz))
-			{
-				return (T)addresses.get(id);
-			}
-			else if (Contact.class.equals(clazz))
-			{
-				return (T)contacts.get(id);
-			}
-			throw new RuntimeException();
-		}
-
-		Store()
-		{
-			for (int i = 0; i < 250; i++)
-			{
-				Contact contact = new Contact();
-				contacts.put(contact.id, contact);
-			}
-		}
-
-	}
-
-	private static class ContactModel extends LoadableDetachableModel<Contact>
-	{
-		private String id;
-
-		ContactModel(Contact contact)
-		{
-			super(contact);
-			this.id = contact.id;
-		}
-
-		@Override
-		protected Contact load()
-		{
-			return store.contacts.get(id);
-		}
-
-	}
-
-	private static abstract class AbstractPhonePanel extends TestPanel
-	{
-		AbstractPhonePanel(String id, IModel<PhoneNumber> phone)
-		{
-			super(id);
-			setPanelMarkup("<wicket:panel><span wicket:id='areacode'></span> <span wicket:id='prefix'></span>-<span wicket:id='suffix'></span></wicket:panel>");
-		}
-	}
-
-	private static class AddPhonePanel extends AbstractPhonePanel
-	{
-		AddPhonePanel(String id, IModel<PhoneNumber> phone)
-		{
-			super(id, phone);
-			add(new Label("areacode", new PropertyModel(phone, "areacode")));
-			add(new Label("prefix", new PropertyModel(phone, "prefix")));
-			add(new Label("suffix", new PropertyModel(phone, "suffix")));
-		}
-	}
-	private static class QueuePhonePanel extends AbstractPhonePanel
-	{
-		public QueuePhonePanel(String id, IModel<PhoneNumber> phone)
-		{
-			super(id, phone);
-			queue(new Label("areacode", new PropertyModel(phone, "areacode")));
-			queue(new Label("prefix", new PropertyModel(phone, "prefix")));
-			queue(new Label("suffix", new PropertyModel(phone, "suffix")));
-		}
-	}
-
-	private static abstract class AbstractAddressPanel extends TestPanel
-	{
-		AbstractAddressPanel(String id, IModel<Address> addr)
-		{
-			super(id);
-			setPanelMarkup("<wicket:panel><span wicket:id='street'></span><br/><span wicket:id='city'></span>, <span wicket:id='state'></span> <span wicket:id='zipcode'></span></wicket:panel>");
-		}
-	}
-
-	private static class AddAddressPanel extends AbstractAddressPanel
-	{
-		AddAddressPanel(String id, IModel<Address> addr)
-		{
-			super(id, addr);
-			add(new Label("street", new PropertyModel(addr, "street")));
-			add(new Label("city", new PropertyModel(addr, "city")));
-			add(new Label("state", new PropertyModel(addr, "state")));
-			add(new Label("zipcode", new PropertyModel(addr, "zipcode")));
-		}
-	}
-	private class QueueAddressPanel extends AbstractAddressPanel
-	{
-		public QueueAddressPanel(String id, IModel<Address> addr)
-		{
-			super(id, addr);
-			queue(new Label("street", new PropertyModel(addr, "street")));
-			queue(new Label("city", new PropertyModel(addr, "city")));
-			queue(new Label("sate", new PropertyModel(addr, "state")));
-			queue(new Label("zipcode", new PropertyModel(addr, "zipcode")));
-		}
-	}
-
-	static class AbstractContactsPage extends TestPage
-	{
-		AbstractContactsPage()
-		{
-			// @formatter:off
-			setPageMarkup(
-				"  <div wicket:id='contacts'>"
-				+ "  <span wicket:id='first'></span>"
-				+ "  <span wicket:id='last'></span>"
-				+ "  <div wicket:id='addr'></div>"
-				+ "  <div wicket:id='work'></div>"
-				+ "  <div wicket:id='cell'></div>"
-				+ "</div>");
-			// @formatter:on
-
-		}
-	}
-
-	public static class AddContactsPage extends AbstractContactsPage
-	{
-		public AddContactsPage()
-		{
-			add(new RefreshingView<Contact>("contacts")
-			{
-				@Override
-				protected Iterator<IModel<Contact>> getItemModels()
-				{
-					return new ModelIteratorAdapter<Contact>(store.contacts.values())
-					{
-						@Override
-						protected IModel<Contact> model(Contact object)
-						{
-							return new ContactModel(object);
-						}
-					};
-				}
-
-				@Override
-				protected void populateItem(Item<Contact> item)
-				{
-					IModel<Contact> model = item.getModel();
-					item.add(new Label("first", new PropertyModel(model, "first")));
-					item.add(new Label("last", new PropertyModel(model, "first")));
-					item.add(new AddAddressPanel("addr", new PropertyModel<Address>(model, "address")));
-					item.add(new AddPhonePanel("work", new PropertyModel<PhoneNumber>(model, "work")));
-					item.add(new AddPhonePanel("cell", new PropertyModel<PhoneNumber>(model, "cell")));
-				}
-			});
-
-		}
-	}
-
-	public static class QueueContactsPage extends AbstractContactsPage
-	{
-		public QueueContactsPage()
-		{
-			queue(new RefreshingView<Contact>("contacts")
-			{
-				@Override
-				protected Iterator<IModel<Contact>> getItemModels()
-				{
-					return new ModelIteratorAdapter<Contact>(store.contacts.values())
-					{
-						@Override
-						protected IModel<Contact> model(Contact object)
-						{
-							return new ContactModel(object);
-						}
-					};
-				}
-
-				@Override
-				protected void populateItem(Item<Contact> item)
-				{
-					IModel<Contact> model = item.getModel();
-					item.queue(new Label("first", new PropertyModel(model, "first")));
-					item.queue(new Label("last", new PropertyModel(model, "first")));
-					item.queue(new AddAddressPanel("addr", new PropertyModel<Address>(model, "address")));
-					item.queue(new AddPhonePanel("work", new PropertyModel<PhoneNumber>(model, "work")));
-					item.queue(new AddPhonePanel("cell", new PropertyModel<PhoneNumber>(model, "cell")));
-				}
-			});
-
-		}
-	}
-
-	private static class TestPage extends WebPage implements IMarkupResourceStreamProvider
-	{
-		private String markup;
-
-		TestPage()
-		{
-		}
-
-		public TestPage(String markup)
-		{
-			this.markup = markup;
-		}
-
-		String getPageMarkup()
-		{
-			return markup;
-		}
-
-		void setPageMarkup(String markup)
-		{
-			this.markup = markup;
-		}
-
-		@Override
-		public IResourceStream getMarkupResourceStream(MarkupContainer container,
-			Class<?> containerClass)
-		{
-			return new StringResourceStream(getPageMarkup());
-		}
-
-	}
-
-	private static class TestPanel extends Panel implements IMarkupResourceStreamProvider
-	{
-
-		private String markup;
-
-		TestPanel(String id)
-		{
-			super(id);
-		}
-
-		void setPanelMarkup(String markup)
-		{
-			this.markup = markup;
-		}
-
-		String getPanelMarkup()
-		{
-			return markup;
-		}
-
-		@Override
-		public IResourceStream getMarkupResourceStream(MarkupContainer container,
-			Class<?> containerClass)
-		{
-			return new StringResourceStream(getPanelMarkup());
-		}
-	}
-}
diff --git a/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java b/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java
deleted file mode 100644
index e3f90b4..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/queueing/ComponentQueueingTest.java
+++ /dev/null
@@ -1,1135 +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.queueing;
-
-import static org.apache.wicket.queueing.WicketMatchers.hasPath;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-
-import java.util.ArrayList;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.WicketRuntimeException;
-import org.apache.wicket.markup.IMarkupResourceStreamProvider;
-import org.apache.wicket.markup.html.TransparentWebMarkupContainer;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.border.Border;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.markup.html.internal.Enclosure;
-import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.markup.html.panel.Fragment;
-import org.apache.wicket.markup.html.panel.Panel;
-import org.apache.wicket.model.Model;
-import org.apache.wicket.queueing.bodyisachild.BodyIsAChildPage;
-import org.apache.wicket.queueing.bodyisachild.LoginPanel;
-import org.apache.wicket.queueing.nestedborders.InnerBorder;
-import org.apache.wicket.queueing.nestedborders.OuterBorder;
-import org.apache.wicket.queueing.nestedpanels.InnerPanel;
-import org.apache.wicket.queueing.nestedpanels.OuterPanel;
-import org.apache.wicket.util.resource.IResourceStream;
-import org.apache.wicket.util.resource.StringResourceStream;
-import org.apache.wicket.util.tester.FormTester;
-import org.apache.wicket.util.tester.WicketTestCase;
-import org.junit.jupiter.api.Test;
-
-class ComponentQueueingTest extends WicketTestCase
-{
-	/** {@code [a,b,c] -> [a[b[c]]] } */
-	@Test
-	void dequeue1()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='b'><p wicket:id='c'></p></p></p>");
-		MarkupContainer a = new A(), b = new B(), c = new C();
-
-		p.queue(b, c, a);
-		assertThat(p, hasPath(a, b, c));
-		tester.startPage(p);
-	}
-
-	/**
-	 * https://issues.apache.org/jira/browse/WICKET-6361
-	 */
-	@Test
-	void dequeueComponentsOnInitialization()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='b'><p wicket:id='c'></p></p></p>");
-		MarkupContainer a = new A(), b = new B(), c = new C();
-		
-		//components are queued before their nested container is added to the page.
-		//this caused a "Detach called on component...while it had a non-empty queue" before WICKET-6361 was fixed
-		b.queue(c);
-		a.add(b);
-		
-		p.add(a);
-
-		tester.startPage(p);
-	}
-	
-	/** {@code [a[b,c]] -> [a[b[c]]] } */
-	@Test
-	void dequeue2()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='b'><p wicket:id='c'></p></p></p>");
-		MarkupContainer a = new A(), b = new B(), c = new C();
-
-		p.queue(a);
-		a.queue(b, c);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(a, b, c));
-	}
-
-	/** {@code [a[b[c]] -> [a[b[c]]] } */
-	@Test
-	void dequeue3()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='b'><p wicket:id='c'></p></p></p>");
-		MarkupContainer a = new A(), b = new B(), c = new C();
-
-		p.queue(a);
-		a.queue(b);
-		b.queue(c);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(a, b, c));
-	}
-
-	/** {@code [a[b],c] -> [a[b[c]]] } */
-	@Test
-	void dequeue4()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='b'><p wicket:id='c'></p></p></p>");
-		MarkupContainer a = new A(), b = new B(), c = new C();
-
-		p.queue(a, c);
-		a.queue(b);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(a, b, c));
-	}
-
-	/** {@code [a(b)],c] -> [a[b[c]]] } */
-	@Test
-	void dequeue5()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='b'><p wicket:id='c'></p></p></p>");
-		MarkupContainer a = new A(), b = new B(), c = new C();
-		p.queue(a, c);
-		a.add(b);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(a, b, c));
-	}
-
-	/** {@code [a,b,c] -> [a[b,c]] } */
-	@Test
-	void dequeue6()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='b'></p><p wicket:id='c'></p></p>");
-		MarkupContainer a = new A(), b = new B(), c = new C();
-
-		p.queue(a, b, c);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(new Path(a, b)));
-		assertThat(p, hasPath(new Path(a, c)));
-	}
-
-	/**
-	 * {a[b{e}[d,f{g}]],c} -> [a[b[c,d[e],f[g]]]]
-	 */
-	@Test
-	void dequeue7()
-	{
-		TestPage p = new TestPage();
-
-		// @formatter:off
-		p.setPageMarkup(
-			"  <p wicket:id='a'>"
-			+ "  <p wicket:id='b'>"
-			+ "    <p wicket:id='c'></p>"
-			+ "    <p wicket:id='d'>"
-			+ "      <p wicket:id='e'></p>"
-			+ "    </p>"
-			+ "    <p wicket:id='f'>"
-			+ "      <p wicket:id='g'></p>"
-			+ "    </p>"
-			+ "  </p>"
-			+ "</p>");
-		// @formatter:on
-
-		MarkupContainer a = new A(), b = new B(), c = new C(), d = new D(), e = new E(), f = new F(), g = new G();
-
-		a.add(b);
-		b.queue(e);
-		p.queue(a, c);
-		b.add(d);
-		f.queue(g);
-		b.add(f);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(new Path(a, b, c)));
-		assertThat(p, hasPath(new Path(a, b, d, e)));
-		assertThat(p, hasPath(new Path(a, b, f, g)));
-	}
-
-
-	/** {@code [a,c[b]] ->| [a[b[c]]] } */
-	@Test
-	void dequeueError1()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='b'><p wicket:id='c'></p></p></p>");
-		MarkupContainer a = new A(), b = new B(), c = new C();
-
-		p.queue(b, c);
-		c.queue(a);
-
-		try
-		{
-			tester.startPage(p);
-			fail();
-		}
-		catch (WicketRuntimeException e)
-		{
-			// expected
-		}
-	}
-
-	/** {@code [a,q[r,s]] - > [a[q[r[s]]]] } */
-	@Test
-	void panel1()
-	{
-		MarkupContainer a = new A(), r = new R(), s = new S();
-
-		TestPanel q = new TestPanel("q");
-		q.setPanelMarkup("<wicket:panel><p wicket:id='r'><p wicket:id='s'></p></p></wicket:panel>");
-		q.queue(r, s);
-
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='q'></p></p>");
-
-		p.queue(a, q);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(new Path(a, q, r, s)));
-	}
-
-	/** panel has leading markup */
-	@Test
-	void panel2()
-	{
-		MarkupContainer r = new R();
-
-		TestPanel q = new TestPanel("q");
-		q.setPanelMarkup("<html><body><wicket:panel><p wicket:id='r'></p></wicket:panel></body></html>");
-		q.queue(r);
-
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='q'></p>");
-		p.queue(q);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(new Path(q, r)));
-	}
-
-	/** panel with a static header section */
-	@Test
-	void panel3()
-	{
-		MarkupContainer r = new R();
-
-		TestPanel q = new TestPanel("q");
-		q.setPanelMarkup("<html><head><wicket:head><meta/></wicket:head></head>"
-			+ "<body><wicket:panel><p wicket:id='r'></p></wicket:panel></body></html>");
-		q.queue(r);
-
-		TestPage p = new TestPage();
-		p.setPageMarkup("<html><head></head><body><p wicket:id='q'></p></body></html>");
-		p.queue(q);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(new Path(q, r)));
-		tester.assertContains("<meta/>"); // contributed by <wicket:head>
-	}
-
-	/**
-	 * test with inner panels
-	 */
-	@Test
-	void nestedPanels()
-	{
-		MarkupContainer r = new R(), s = new S();
-
-		Panel innerPanel = new InnerPanel("inner");
-		innerPanel.queue(s);
-
-		Panel outerPanel = new OuterPanel("outer");
-
-		outerPanel.queue(r, innerPanel);
-
-		TestPage p = new TestPage();
-		p.setPageMarkup("<html><head></head><body><p wicket:id='outer'></p></body></html>");
-		p.queue(outerPanel);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(new Path(outerPanel, r)));
-		assertThat(p, hasPath(new Path(outerPanel, innerPanel, s)));
-		tester.assertContains("<meta/>"); // contributed by <wicket:head> in outer
-		tester.assertContains("<meta2/>"); // contributed by <wicket:head> in inner
-	}
-
-	@Test
-	void repeater1()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='lv'><p wicket:id='b'><p wicket:id='c'></p></p></p>");
-
-		LV l = new LV(3)
-		{
-			@Override
-			protected void populateItem(ListItem<Integer> item)
-			{
-				item.queue(new B(), new C());
-			}
-		};
-
-		p.queue(l);
-
-		tester.startPage(p);
-
-		assertEquals(3, l.size());
-		for (Component item : l)
-		{
-			assertThat(p, hasPath(new Path(l, item, new B(), new C())));
-		}
-	}
-
-	/** repeater */
-	@Test
-	void repeater2()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='lv'><p wicket:id='b'><p wicket:id='c'></p></p></p></p>");
-
-		MarkupContainer a = new A();
-		LV l = new LV(3)
-		{
-			@Override
-			protected void populateItem(ListItem<Integer> item)
-			{
-				item.queue(new B(), new C());
-			}
-		};
-
-		p.queue(a, l);
-
-		tester.startPage(p);
-
-		assertEquals(3, l.size());
-		for (Component item : l)
-		{
-			assertThat(p, hasPath(new Path(a, l, item, new B(), new C())));
-		}
-	}
-
-	/** repeater with a panel inside */
-	@Test
-	void repeater3()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='lv'><p wicket:id='b'><p wicket:id='q'></p></p></p></p>");
-
-		MarkupContainer a = new A();
-		LV l = new LV(3)
-		{
-			@Override
-			protected void populateItem(ListItem<Integer> item)
-			{
-				TestPanel q = new TestPanel("q");
-				q.setPanelMarkup("<wicket:panel><p wicket:id='r'><p wicket:id='s'></p></p></wicket:panel>");
-				q.queue(new R(), new S());
-
-				item.queue(q, new B());
-			}
-		};
-
-		p.queue(a, l);
-
-		tester.startPage(p);
-
-		assertEquals(3, l.size());
-		for (Component item : l)
-		{
-			assertThat(p, hasPath(new Path(a, l, item, new B()).add("q").add(new R(), new S())));
-		}
-	}
-
-	/** dequeue, then rerender the page instance after a callback is executed */
-	@Test
-	void callback()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><a wicket:id='l'><p wicket:id='b'></p></a></p>");
-		MarkupContainer a = new A(), b = new B();
-		L l = new L();
-		p.queue(a, b, l);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(new Path(a, l, b)));
-		assertEquals(false, l.isClicked());
-
-		tester.clickLink(l);
-
-		assertEquals(true, l.isClicked());
-	}
-
-
-	/** queuing two components with the same id */
-	@Test
-	void queueIdCollission()
-	{
-		try
-		{
-			new A().queue(new B(), new B());
-			fail("Should not be able to queue two components with the same id under the same parent");
-		}
-		catch (WicketRuntimeException e)
-		{
-			// expected
-		}
-	}
-
-
-	@Test
-	void autos1()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<wicket:enclosure child='a'><div wicket:id='a'></div><div wicket:id='b'></div></wicket:enclosure>");
-		A a = new A();
-		B b = new B();
-		p.queue(a, b);
-		tester.startPage(p);
-
-		assertTrue(a.getParent() instanceof Enclosure);
-		assertTrue(b.getParent() instanceof Enclosure);
-
-		// A is visible, enclosure renders
-
-		assertEquals(
-			"<wicket:enclosure child=\"a\"><div wicket:id=\"a\"></div><div wicket:id=\"b\"></div></wicket:enclosure>",
-			tester.getLastResponseAsString());
-
-		// A is not visible, enclosure does not render
-
-		a.setVisible(false);
-		tester.startPage(p);
-		assertEquals("", tester.getLastResponseAsString());
-	}
-
-	@Test
-	void autos2()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<wicket:enclosure child='a'><div wicket:id='a'></div><div wicket:id='b'></div></wicket:enclosure>");
-		A a = new A();
-		B b = new B();
-		p.add(a, b);
-		tester.startPage(p);
-
-		assertTrue(a.getParent() instanceof TestPage);
-		assertTrue(b.getParent() instanceof TestPage);
-
-		// A is visible, enclosure renders
-
-		assertEquals(
-			"<wicket:enclosure child=\"a\"><div wicket:id=\"a\"></div><div wicket:id=\"b\"></div></wicket:enclosure>",
-			tester.getLastResponseAsString());
-
-		// A is not visible, enclosure does not render
-
-		a.setVisible(false);
-		tester.startPage(p);
-		assertEquals("", tester.getLastResponseAsString());
-	}
-
-	@Test
-	void autos3()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<wicket:enclosure child='a'><div wicket:id='a'></div><div wicket:id='b'></div></wicket:enclosure>");
-		A a = new A();
-		B b = new B();
-		p.queue(b);
-		p.add(a);
-		tester.startPage(p);
-
-		assertTrue(a.getParent() instanceof TestPage);
-		assertTrue(b.getParent() instanceof Enclosure);
-
-		// A is visible, enclosure renders
-
-		assertEquals(
-			"<wicket:enclosure child=\"a\"><div wicket:id=\"a\"></div><div wicket:id=\"b\"></div></wicket:enclosure>",
-			tester.getLastResponseAsString());
-
-		// A is not visible, enclosure does not render
-
-		a.setVisible(false);
-		tester.startPage(p);
-		assertEquals("", tester.getLastResponseAsString());
-	}
-
-	@Test
-	void autos4()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<wicket:enclosure child='a'><div wicket:id='a'></div><div wicket:id='b'></div></wicket:enclosure>");
-		A a = new A();
-		B b = new B();
-		p.add(b);
-		p.queue(a);
-		tester.startPage(p);
-
-		assertTrue(a.getParent() instanceof Enclosure);
-		assertTrue(b.getParent() instanceof TestPage);
-
-		// A is visible, enclosure renders
-
-		assertEquals(
-			"<wicket:enclosure child=\"a\"><div wicket:id=\"a\"></div><div wicket:id=\"b\"></div></wicket:enclosure>",
-			tester.getLastResponseAsString());
-
-		// A is not visible, enclosure does not render
-
-		a.setVisible(false);
-		tester.startPage(p);
-		assertEquals("", tester.getLastResponseAsString());
-	}
-
-	@Test
-	void autos5()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<wicket:enclosure child='a'><div wicket:id='a'></div><div wicket:id='b'></div></wicket:enclosure>");
-		A a = new A();
-		B b = new B();
-		p.queue(a);
-		p.add(b);
-		tester.startPage(p);
-
-		assertTrue(a.getParent() instanceof Enclosure);
-		assertTrue(b.getParent() instanceof TestPage);
-
-
-		// A is visible, enclosure renders
-
-		assertEquals(
-			"<wicket:enclosure child=\"a\"><div wicket:id=\"a\"></div><div wicket:id=\"b\"></div></wicket:enclosure>",
-			tester.getLastResponseAsString());
-
-		// A is not visible, enclosure does not render
-
-		a.setVisible(false);
-		tester.startPage(p);
-		assertEquals("", tester.getLastResponseAsString());
-	}
-
-	/**
-	 * Test InlineEnclosure
-	 */
-	@Test
-	void autos6()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<div wicket:enclosure='a'><div wicket:id='a'></div><div wicket:id='b'></div></div>");
-		A a = new A();
-		B b = new B();
-		p.queue(a, b);
-		tester.startPage(p);
-
-		assertTrue(a.getParent() instanceof Enclosure);
-		assertTrue(b.getParent() instanceof Enclosure);
-
-		// A is visible, enclosure renders
-
-		assertEquals(
-				"<div wicket:enclosure=\"a\" id=\"wicket__InlineEnclosure_20793898271\"><div wicket:id=\"a\"></div><div wicket:id=\"b\"></div></div>",
-				tester.getLastResponseAsString());
-
-		// A is not visible, inline enclosure render only itself (the placeholder tag)
-
-		a.setVisible(false);
-		tester.startPage(p);
-		assertEquals("<div id=\"wicket__InlineEnclosure_20793898271\" hidden=\"\" data-wicket-placeholder=\"\"></div>", tester.getLastResponseAsString());
-	}
-	
-	/**
-	 * Test empty child attribute
-	 */
-	@Test
-	void autos7()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<wicket:enclosure child=''><div wicket:id='a'></div></wicket:enclosure>");
-		A a = new A();
-		
-		p.queue(a);
-		tester.startPage(p);
-
-		assertTrue(a.getParent() instanceof Enclosure);
-		
-
-		// A is visible, enclosure renders
-
-		assertEquals(
-			"<wicket:enclosure child=\"a\"><div wicket:id=\"a\"></div></wicket:enclosure>",
-			tester.getLastResponseAsString());
-
-		// A is not visible, enclosure does not render
-
-		a.setVisible(false);
-		tester.startPage(p);
-		assertEquals("", tester.getLastResponseAsString());
-	}
-	
-	/**
-	 * Test autocomponent inside not-queue region
-	 */
-	@Test
-	void autosInsideNotQueueRegion()
-	{
-		TestPage p = new TestPage();
-		p.setPageMarkup("<div wicket:id='outerContainer'><wicket:enclosure><div wicket:id='a'></div></wicket:enclosure></div>");
-		Label a = new Label("a", "a");
-		WebMarkupContainer outer;
-		p.add(outer = new WebMarkupContainer("outerContainer"));
-		outer.queue(a);
-		
-		tester.startPage(p);
-
-		assertTrue(a.getParent() instanceof Enclosure);
-	}
-	
-	@Test
-	void border1()
-	{
-		MarkupContainer a = new A(), b = new B(), r = new R(), s = new S();
-
-		TestBorder border = new TestBorder("border");
-		border.setBorderMarkup("<wicket:border><b1 wicket:id='r'><b2 wicket:id='s'>" +
-				"<wicket:body/></b2></b1></wicket:border>");
-		border.queueToBorder(r, s);
-
-		TestPage p = new TestPage();
-		p.setPageMarkup("<out1 wicket:id='a'><p wicket:id='border'><in1 wicket:id='b'></in1></p></out1>");
-
-		p.queue(a, border, b);
-
-		tester.startPage(p);
-
-		assertThat(p, hasPath(new Path(a, border, r, s, border.getBodyContainer(), b)));
-	}
-	
-	@Test
-	void queueBorderBody() throws Exception
-	{
-
-		TestBorder border = new TestBorder("border");
-		border.setBorderMarkup("<wicket:border><wicket:body/></wicket:border>");
-
-		TestPage p = new TestPage();
-		p.setPageMarkup("<div wicket:id=\"border\"><span wicket:id=\"label\"></span></div>");
-		
-		p.add(border);
-		border.queue(new Label("label", "test"));
-		
-		tester.startPage(p);
-	}
-
-	@Test
-	void border_nested()
-	{
-		MarkupContainer a = new A(), b = new B(), c= new C(), d = new D(), r = new R(), s = new S();
-
-		Border outerBorder = new OuterBorder("outerBorder");
-
-		Border innerBorder = new InnerBorder("innerBorder");
-
-		outerBorder.queueToBorder(r, innerBorder);
-
-		innerBorder.queueToBorder(c, d);
-
-		outerBorder.queueToBorder(s);
-
-
-		TestPage p = new TestPage();
-		p.setPageMarkup("<p wicket:id='a'><p wicket:id='outerBorder'><p wicket:id='b'></p></p></p>");
-		
-		p.queue(b, outerBorder, a);
-
-		tester.startPage(p);
-		
-		assertThat(p, hasPath(new Path(a, outerBorder,  r, innerBorder, c, d, innerBorder.getBodyContainer(), s)));
-		assertThat(p, hasPath(new Path(a, outerBorder, r, outerBorder.getBodyContainer(), b)));
-	}
-
-	@Test
-	void fragment1() {
-		MarkupContainer a = new A(), b = new B(), r = new R(), s = new S();
-		
-		TestPage page = new TestPage();
-		page.setPageMarkup("<a wicket:id='a'></a><f wicket:id='fragment'></f><b wicket:id='b'></b>"
-			+ "<wicket:fragment wicket:id='f'><r wicket:id='r'></r><s wicket:id='s'></s></wicket:fragment>");
-		
-		Fragment fragment = new Fragment("fragment", "f", page);
-
-		fragment.queue(r, s);
-		page.queue(a, b, fragment);
-		
-		assertThat(page, hasPath(new Path(a)));
-		assertThat(page, hasPath(new Path(b)));
-		assertThat(page, hasPath(new Path(fragment, r)));
-		assertThat(page, hasPath(new Path(fragment, s)));
-	}
-
-	@Test
-	void fragment_doesNotDequeueAcrossRegion()
-	{
-		MarkupContainer a = new A();
-
-		TestPage page = new TestPage();
-		page.setPageMarkup("<f wicket:id='fragment'></f><wicket:fragment wicket:id='f'><a wicket:id='a'></a></wicket:fragment>");
-
-		Fragment fragment = new Fragment("fragment", "f", page);
-
-		page.queue(a, fragment);
-
-		assertThat(page, hasPath(new Path(fragment)));
-		assertNull(a.getParent());
-	}
-
-	
-	@Test
-	void containerTag1()
-	{
-		MarkupContainer a = new A(), b = new B();
-
-		TestPage page = new TestPage();
-		page.setPageMarkup("<wicket:container wicket:id='a'><b wicket:id='b'></b></wicket:container>");
-
-		page.queue(a, b);
-
-		assertThat(page, hasPath(new Path(a, b)));
-	}
-	
-	@Test
-	void queueInsideHeader()
-	{
-		TestPage page = new TestPage();
-		page.setPageMarkup("<html>"
-			+"<head><title wicket:id='title'></title></head>"
-			+ "<body><div>"
-			+ "Hello!"
-			+ "</div></body>"
-			+ "</html>");
-		
-		page.queue(new Label("title"));
-		
-		tester.startPage(page);	
-		
-		tester.assertContains("title");
-	}
-	
-	@Test
-	void queueInsideAutoLink()
-	{
-		TestPage page = new TestPage();
-		page.setPageMarkup("<wicket:link>"
-			+ "<a href='test.html'>"
-			+ "<wicket:container wicket:id='test'>test</wicket:container>"
-			+ "</a></wicket:link>");
-		
-		page.queue(new WebMarkupContainer("test"));
-		
-		tester.startPage(page);	
-	}
-	
-	@Test
-	void queueInsideLabelComponent()
-	{
-		TestPage page = new TestPage();
-		page.setPageMarkup("<label wicket:for='input'>"
-				+ "label:"
-				+ "<input wicket:id='input'/>"
-				+ "</label>");
-		
-		page.queue(new TextField<>("input", Model.of("test")));
-		
-		tester.startPage(page);	
-	}
-	
-	@Test
-	void queueInsideTransparentContainer() throws Exception
-	{
-		TestPage page = new TestPage();
-		page.setPageMarkup("<div wicket:id='transparentContainer'>"
-			+ "	<div wicket:id='container'>"
-			+ "		<div wicket:id='child'>"
-			+ " 	</div>"
-			+ " </div>"
-			+ "</div>");
-		
-		page.add(new TransparentWebMarkupContainer("transparentContainer"));
-		page.add(new WebMarkupContainer("container"));
-		page.queue(new WebMarkupContainer("child"));
-		
-		tester.startPage(page);	
-	}
-
-	@Test
-	void queueNestedEnclosure()
-	{
-		TestPage page = new TestPage();
-		page.setPageMarkup( "<div wicket:enclosure='outer'>" +
-			"<div wicket:id='outer'>" +
-			"	<div wicket:enclosure='middle'>" +
-			"		<div wicket:enclosure='inner'>" +
-			"			<div wicket:id='inner'>inner</div>" +
-			"		</div>" +
-			"		<div wicket:id='middle'>middle</div>" +
-			"	</div>" +
-			"	outer" +
-			"</div>" +
-			"</div>");
-		
-		WebMarkupContainer container = new WebMarkupContainer("outer");
-		container.add(new WebMarkupContainer("middle"));
-		container.add(new WebMarkupContainer("inner"));
-		
-		page.add(container);
-		
-		tester.startPage(page);	
-	}
-	
-	/**
-	 * https://issues.apache.org/jira/browse/WICKET-6088
-	 */
-	@Test
-	void queueComponentInsideWcAndEnclosure()
-	{
-		TestPage page = new TestPage();
-		page.setPageMarkup(" <div wicket:id=\"container\">\n" +
-			"    <div wicket:enclosure=\"child\">\n" +
-			"      <p wicket:id=\"child\">1</p>\n" +
-			"      <a wicket:id=\"child2\">2</a>\n" +
-			"    </div>\n" +
-			"  </div>");
-		
-		WebMarkupContainer container = new WebMarkupContainer("container");
-
-		container.queue(new Label("child")
-		{
-			@Override
-			protected void onInitialize()
-			{
-				super.onInitialize();
-
-				setDefaultModel(Model.of("test"));
-			}
-		});
-		
-	    container.queue(new WebMarkupContainer("child2").setVisible(false));
-
-	    page.queue(container);
-		
-		tester.startPage(page);	
-	}
-	@Test
-	void queueComponentInsideBorderAndEnclosure()
-	{
-		TestPage page = new TestPage();
-		page.setPageMarkup(" <div wicket:id=\"panel\"></div>");
-		
-		TestPanel panel = new TestPanel("panel");
-		panel.setPanelMarkup("<wicket:panel>\n"
-			+ "<div wicket:id=\"border\">\n" +
-			"    <div wicket:enclosure=\"child\">\n" +
-			"      <p wicket:id=\"child\">1</p>\n" +			
-			"    </div>\n" +
-			"  </div>\n" +
-			"</wicket:panel>");
-		
-		TestBorder border = new TestBorder("border");
-		border.setBorderMarkup("<wicket:border><wicket:body/></wicket:border>");
-		
-		panel.add(border);
-		page.add(panel);
-		border.add(new Label("child"));
-				
-		tester.startPage(page);	
-	}
-
-	/**
-	 * https://issues.apache.org/jira/browse/WICKET-6036
-	 */
-	@Test
-	void nestedTags()
-	{
-		IncorrectCloseTagPanel p = new IncorrectCloseTagPanel("test");
-		tester.startComponentInPage(p);
-	}
-
-	/**
-	 * https://issues.apache.org/jira/browse/WICKET-6077
-	 */
-	@Test
-	void bodyIsAChild() {
-		tester.startPage(BodyIsAChildPage.class);
-
-		tester.assertRenderedPage(BodyIsAChildPage.class);
-
-		String username = "USER";
-		String password = "PASSWD";
-
-		FormTester formTester = tester.newFormTester("wmc:login:loginForm");
-		formTester.setValue("usernameFormGroup:usernameFormGroup_body:username", username);
-		formTester.setValue("passwordFormGroup:passwordFormGroup_body:password", password);
-		formTester.submit();
-
-		LoginPanel loginPanel = (LoginPanel) tester.getComponentFromLastRenderedPage("wmc:login");
-		assertEquals(username, loginPanel.pojo.username);
-		assertEquals(password, loginPanel.pojo.password);
-	}
-
-	private static class A extends WebMarkupContainer
-	{
-		A()
-		{
-			super("a");
-		}
-	}
-
-	private static class B extends WebMarkupContainer
-	{
-		B()
-		{
-			super("b");
-		}
-	}
-
-	private static class C extends WebMarkupContainer
-	{
-		C()
-		{
-			super("c");
-		}
-	}
-
-	private static class D extends WebMarkupContainer
-	{
-		D()
-		{
-			super("d");
-		}
-	}
-
-	private static class E extends WebMarkupContainer
-	{
-		E()
-		{
-			super("e");
-		}
-	}
-
-	private static class F extends WebMarkupContainer
-	{
-		F()
-		{
-			super("f");
-		}
-	}
-	private static class G extends WebMarkupContainer
-	{
-		G()
-		{
-			super("g");
-		}
-	}
-
-	private static class R extends WebMarkupContainer
-	{
-		R()
-		{
-			super("r");
-		}
-	}
-
-	private static class S extends WebMarkupContainer
-	{
-		S()
-		{
-			super("s");
-		}
-	}
-
-	private static abstract class LV extends ListView<Integer>
-	{
-		LV(int size)
-		{
-			super("lv");
-			ArrayList<Integer> values = new ArrayList<>();
-			for (int i = 0; i < size; i++)
-				values.add(i);
-			setModel(new Model<>(values));
-		}
-	}
-
-	private static class L extends Link<Void>
-	{
-		private boolean clicked = false;
-
-		L()
-		{
-			super("l");
-		}
-
-		@Override
-		public void onClick()
-		{
-			clicked = true;
-		}
-
-		boolean isClicked()
-		{
-			return clicked;
-		}
-	}
-
-
-	private static class TestPage extends WebPage implements IMarkupResourceStreamProvider
-	{
-		private String markup;
-
-		TestPage()
-		{
-		}
-
-		public TestPage(String markup)
-		{
-			this.markup = markup;
-		}
-
-		String getPageMarkup()
-		{
-			return markup;
-		}
-
-		void setPageMarkup(String markup)
-		{
-			this.markup = markup;
-		}
-
-		@Override
-		public IResourceStream getMarkupResourceStream(MarkupContainer container,
-			Class<?> containerClass)
-		{
-			return new StringResourceStream(getPageMarkup());
-		}
-
-	}
-
-	private static class TestPanel extends Panel implements IMarkupResourceStreamProvider
-	{
-		private String markup;
-
-		TestPanel(String id)
-		{
-			super(id);
-		}
-
-		void setPanelMarkup(String markup)
-		{
-			this.markup = markup;
-		}
-
-		String getPanelMarkup()
-		{
-			return markup;
-		}
-
-		@Override
-		public IResourceStream getMarkupResourceStream(MarkupContainer container,
-			Class<?> containerClass)
-		{
-			return new StringResourceStream(getPanelMarkup());
-		}
-	}
-
-	private static class TestBorder extends Border implements IMarkupResourceStreamProvider
-	{
-		private String markup;
-
-		TestBorder(String id)
-		{
-			super(id);
-		}
-
-		void setBorderMarkup(String markup)
-		{
-			this.markup = markup;
-		}
-
-		String getBorderMarkup()
-		{
-			return markup;
-		}
-
-		@Override
-		public IResourceStream getMarkupResourceStream(MarkupContainer container,
-		                                               Class<?> containerClass)
-		{
-			return new StringResourceStream(getBorderMarkup());
-		}
-	}
-}
diff --git a/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/SubPage.java b/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/SubPage.java
index 6580fb5c..ac48e19 100644
--- a/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/SubPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/SubPage.java
@@ -28,6 +28,6 @@ public class SubPage extends BasePage
 	{
 		super(parameters);
 
-		queue(new Label("version", getApplication().getFrameworkSettings().getVersion()));
+		add(new Label("version", getApplication().getFrameworkSettings().getVersion()));
 	}
 }
diff --git a/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.java b/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.java
index ba2c2d8..2f8d617 100644
--- a/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/queueing/transparentresolvers/TransparentContainerQueuePage.java
@@ -26,7 +26,7 @@ public class TransparentContainerQueuePage extends WebPage
 	public TransparentContainerQueuePage(PageParameters parameters)
 	{
 		super(parameters);
-		queue(new Label("queuedComponent", "Queued label."));
+		add(new Label("queuedComponent", "Queued label."));
 	}
 	
 }
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalDialogPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalDialogPage.java
index 665b100..7df2ae0 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalDialogPage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalDialogPage.java
@@ -57,22 +57,24 @@ public class ModalDialogPage extends BasePage
 	public ModalDialogPage()
 	{
 
-		queue(new RadioGroup("stacked", new PropertyModel<>(this, "stacked"))
-			.setRenderBodyOnly(false).add(new AjaxFormChoiceComponentUpdatingBehavior()
-			{
+		RadioGroup radioGroup = new RadioGroup("stacked", new PropertyModel<>(this, "stacked"));
+		radioGroup
+			.setRenderBodyOnly(false)
+			.add(new AjaxFormChoiceComponentUpdatingBehavior() {
 				@Override
 				protected void onUpdate(AjaxRequestTarget target)
 				{
 				}
-			}));
+			});
+		add(radioGroup);
 
-		queue(new Radio<Boolean>("yes", Model.of(true)));
-		queue(new Radio<Boolean>("no", Model.of(false)));
+		radioGroup.add(new Radio<Boolean>("yes", Model.of(true)));
+		radioGroup.add(new Radio<Boolean>("no", Model.of(false)));
 
-		queue(new ModalFragment("start"));
+		add(new ModalFragment("start"));
 
 		stackedDialogs = new AjaxListPanel("stackedDialogs");
-		queue(stackedDialogs);
+		add(stackedDialogs);
 	}
 
 	@Override
@@ -94,15 +96,15 @@ public class ModalDialogPage extends BasePage
 			super(id, "fragment", ModalDialogPage.this);
 
 			Form<Void> form = new Form<Void>("form");
-			queue(form);
+			add(form);
 			
 			nestedDialog = new ModalDialog("nestedDialog");
 			nestedDialog.add(new DefaultTheme());
 			nestedDialog.trapFocus();
 			nestedDialog.closeOnEscape();
-			queue(nestedDialog);
+			form.add(nestedDialog);
 
-			queue(new AjaxLink<Void>("ajaxOpenDialog")
+			form.add(new AjaxLink<Void>("ajaxOpenDialog")
 			{
 				@Override
 				public void onClick(AjaxRequestTarget target)
@@ -111,7 +113,7 @@ public class ModalDialogPage extends BasePage
 				}
 			});
 
-			queue(new Link<Void>("openDialog")
+			form.add(new Link<Void>("openDialog")
 			{
 				@Override
 				public void onClick()
@@ -120,7 +122,7 @@ public class ModalDialogPage extends BasePage
 				}
 			});
 
-			queue(new TextField("text").add(new AjaxEventBehavior("keydown")
+			form.add(new TextField("text").add(new AjaxEventBehavior("keydown")
 			{
 				@Override
 				protected void updateAjaxAttributes(AjaxRequestAttributes attributes)
@@ -144,7 +146,7 @@ public class ModalDialogPage extends BasePage
 				}
 			}));
 
-			queue(new WebMarkupContainer("closing")
+			WebMarkupContainer closing = new WebMarkupContainer("closing")
 			{
 				@Override
 				protected void onConfigure()
@@ -153,9 +155,10 @@ public class ModalDialogPage extends BasePage
 
 					setVisible(findParent(ModalDialog.class) != null);
 				}
-			});
+			};
+			form.add(closing);
 
-			queue(new Link<Void>("close")
+			closing.add(new Link<Void>("close")
 			{
 				@Override
 				public void onClick()
@@ -166,9 +169,9 @@ public class ModalDialogPage extends BasePage
 			
 			final MultiLineLabel lorem = new MultiLineLabel("lorem", "");
 			lorem.setOutputMarkupId(true);
-			queue(lorem);
+			form.add(lorem);
 			
-			queue(new AjaxLink<Void>("ipsum") {
+			form.add(new AjaxLink<Void>("ipsum") {
 				@Override
 				public void onClick(AjaxRequestTarget target)
 				{