You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2021/06/27 13:37:07 UTC

[wicket] branch wicket-9.x-with-jpms created (now 6dca1d9)

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

mgrigorov pushed a change to branch wicket-9.x-with-jpms
in repository https://gitbox.apache.org/repos/asf/wicket.git.


      at 6dca1d9  Add module-info.java for most Maven modules but http2

This branch includes the following new commits:

     new 6dca1d9  Add module-info.java for most Maven modules but http2

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: Add module-info.java for most Maven modules but http2

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

mgrigorov pushed a commit to branch wicket-9.x-with-jpms
in repository https://gitbox.apache.org/repos/asf/wicket.git

commit 6dca1d9f4063bb9cb9876328abc1b1c050939cbc
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
AuthorDate: Fri Jun 25 16:36:31 2021 +0300

    Add module-info.java for most Maven modules but http2
    
    http2 modules will be JPMS-ed in a separate commit to reduce the merge conflicts with 10.x
    
    These are the known issues:
    - maven-clirr-plugin does not work. Need to use -Dclirr.skip=true
    - many dependencies still do not provide JMPS modules (e.g. servlet-api, commons-fileupload, velocity, ...). We will use them as automodules until they provide proper modules
---
 pom.xml                                            |   6 +-
 .../src/main/java/module-info.java                 |  32 +-
 .../util/license/ApacheLicenceHeaderTest.java      |   4 +-
 .../util/markup/xhtml/WellFormedXmlTest.java       |  69 +-
 .../src/main/java/module-info.java                 |  12 +-
 .../util/license/ApacheLicenceHeaderTest.java      |   4 +-
 .../util/markup/xhtml/WellFormedXmlTest.java       |  69 +-
 .../src/main/java/module-info.java                 |  21 +-
 wicket-core/src/main/java/module-info.java         | 142 ++++
 .../wicket/request/resource/AbstractResource.java  |   3 +-
 .../ajax/form/AjaxFormSubmitBehaviorTest.java      |   4 +-
 .../request/handler/PageIdPolicyTest.java          | 340 ++++-----
 .../request/handler/PageProviderTest.java          |   2 +-
 .../request/handler/render/AbstractVariations.java |   2 +-
 .../handler/render/ShouldRedirectToTargetUrl.java  |   2 +-
 ...ShouldRenderPageAndWriteResponseVariations.java |   2 +-
 .../render/SkipRenderWithSetResponsePageTest.java  |   2 +-
 ...tatelessPageManipulatingPageParametersTest.java |   2 +-
 .../request/handler/render/TestPageRenderer.java   |  13 +-
 .../request/handler/render/TestVariations.java     |   2 +-
 .../request/handler/render/Variation.java          |   2 +-
 .../request/handler/render/VariationIterator.java  |   2 +-
 .../handler/render/WebPageRendererTest.java        |  34 +-
 .../resource/ResourceAuthorizationTest.java        |   2 +-
 .../mapper/AbstractBookmarkableMapperTest.java     |   2 +-
 ...tiRequestCycleListenerCallOrderApplication.java |   4 +-
 .../MultiRequestCycleListenerCallOrderPage.html    |   0
 .../MultiRequestCycleListenerCallOrderPage.java    |   2 +-
 .../MultiRequestCycleListenerCallOrderTest.java    |   2 +-
 .../cycle/PageRequestHandlerTrackerTest.java       |   5 +-
 .../cycle/RequestCycleListenerDetachOrderTest.java | 200 +++---
 .../request/cycle/RequestCycleListenerTest.java    |   5 +-
 .../request/cycle/RequestCycleUrlForTest.java      |   4 +-
 .../request/cycle/RequestHandlerExecutorTest.java  |   2 +-
 .../request}/request/cycle/RerenderAjaxPage.html   |   0
 .../request}/request/cycle/RerenderAjaxPage.java   |   2 +-
 .../request}/request/cycle/RerenderPage.html       |   0
 .../request}/request/cycle/RerenderPage.java       |   2 +-
 .../request}/request/cycle/RerenderPageTest.java   |   4 +-
 .../request}/request/cycle/UrlRendererTest.java    |   2 +-
 .../request/mapper/CustomHomePageTest.java         |   2 +-
 .../request/mapper/info/ComponentInfoTest.java     |   3 +-
 .../request/mapper/info/PageComponentInfoTest.java |   3 +-
 .../request}/request/resource/BundlesPage.html     |   0
 .../request}/request/resource/BundlesPage.java     |   3 +-
 .../request/resource/BundlesPage_ext_result.html   |   0
 .../request/resource/BundlesPage_result.html       |   0
 .../request/resource/BundlesPage_result_defer.html |   0
 .../request/resource/ByteArrayResourceTest.java    |   3 +-
 .../request/resource/CharSequenceResourceTest.java |  22 +-
 .../ContextRelativeResourceReferenceTest.java      |   4 +-
 .../request/resource/CssPackageResourceTest.java   |   3 +-
 .../request/resource/DynamicImageResourceTest.java |   3 +-
 .../resource/JavaScriptPackageResourceTest.java    |   3 +-
 .../request/resource/LessResourceReference.less    |   0
 .../resource/LessResourceReferenceTest.java        |   7 +-
 .../MetaInfStaticResourceReferenceTest.java        | 240 +++----
 .../MinifiedAwareResourceReferenceTest.java        |   4 +-
 .../resource/PackageResourceReferenceTest.java     | 783 +++++++++++----------
 .../request/resource/ResouceBundleTest.java        |   6 +-
 .../resource/ResourceReferenceLambdaTest.java      |   6 +-
 .../resource/ResourceReferenceLocatingTest.csv     |   0
 .../resource/ResourceReferenceLocatingTest.java    |   4 +-
 .../resource/ResourceReferenceRegistryTest.java    |  26 +-
 .../request/resource/UrlResourceReferenceTest.java |   3 +-
 .../request/resource/WriteCallbackTest.java        | 134 ++--
 .../{ => core/request}/request/resource/a.css      |   0
 .../{ => core/request}/request/resource/a.js       |   0
 .../{ => core/request}/request/resource/b.css      |   0
 .../{ => core/request}/request/resource/b.js       |   0
 .../{ => core/request}/request/resource/b.min.css  |   0
 .../{ => core/request}/request/resource/b.min.js   |   0
 .../{ => core/request}/request/resource/b_de.js    |   0
 .../{ => core/request}/request/resource/b_nl.js    |   0
 .../request}/request/resource/b_nl.min.js          |   0
 .../{ => core/request}/request/resource/b_nl_BE.js |   0
 .../request}/request/resource/b_nl_BE.min.js       |   0
 .../{ => core/request}/request/resource/b_style.js |   0
 .../request}/request/resource/b_style.min.js       |   0
 .../request}/request/resource/b_style_nl.js        |   0
 .../request}/request/resource/b_style_nl.min.js    |   0
 .../request}/request/resource/b_style_nl_BE.js     |   0
 .../request}/request/resource/b_style_nl_BE.min.js |   0
 .../request}/request/resource/b_var_style.js       |   0
 .../request}/request/resource/b_var_style.min.js   |   0
 .../request}/request/resource/b_var_style_nl.js    |   0
 .../request/resource/b_var_style_nl.min.js         |   0
 .../request}/request/resource/b_var_style_nl_BE.js |   0
 .../request/resource/b_var_style_nl_BE.min.js      |   0
 .../ContextRelativeResourceCachingTest.java        |   4 +-
 ...nameWithVersionResourceCachingStrategyTest.java |   5 +-
 ...ringWithVersionResourceCachingStrategyTest.java |   5 +-
 .../request/resource/caching/TestResource.java     |   4 +-
 .../request}/request/resource/resource.txt         |   0
 .../request}/request/resource/resource_en.txt      |   0
 .../request}/request/resource/resource_en_US.txt   |   0
 .../request}/request/resource/resource_gt_4096.txt |   0
 .../request}/request/resource/resource_style.txt   |   0
 .../request}/request/resource/resource_style2.txt  |   0
 .../request/resource/resource_style2_pt.txt        |   0
 .../request/resource/resource_style2_pt_BR.txt     |   0
 .../request/resource/resource_style_en.txt         |   0
 .../request/resource/resource_style_en_US.txt      |   0
 .../request}/request/resource/resource_var.txt     |   0
 .../request}/request/resource/resource_var_en.txt  |   0
 .../request/resource/resource_var_en_US.txt        |   0
 .../request/resource/resource_var_style.txt        |   0
 .../request/resource/resource_var_style2.txt       |   0
 .../request/resource/resource_var_style2_pt.txt    |   0
 .../request/resource/resource_var_style2_pt_BR.txt |   0
 .../request/resource/resource_var_style_en.txt     |   0
 .../request/resource/resource_var_style_en_US.txt  |   0
 .../apache/wicket/{ => core}/util/io/PageA.java    |   2 +-
 .../apache/wicket/{ => core}/util/io/PageB.java    |   2 +-
 .../util/io/SerializableCheckerTest.java           | 331 ++++-----
 .../wicket/{ => core}/util/lang/Address.java       |   2 +-
 .../wicket/{ => core}/util/lang/BooleanBean.java   |   2 +-
 .../wicket/{ => core}/util/lang/Country.java       |   2 +-
 .../wicket/{ => core}/util/lang/Country2.java      |  94 +--
 .../wicket/{ => core}/util/lang/Document.java      |   4 +-
 .../apache/wicket/{ => core}/util/lang/Person.java |   2 +-
 .../wicket/{ => core}/util/lang/Person2.java       |   2 +-
 .../{ => core}/util/lang/PropertyResolverTest.java |   4 +-
 .../{ => core}/util/lang/WicketObjectsTest.java    |   2 +-
 .../util/resource/ClassPathResourceFinderTest.java |   2 +-
 .../wicket/{ => core}/util/resource/PathTest.java  |   4 +-
 .../util/resource/ResourceStreamLocatorTest.java   |   4 +-
 .../util/resource}/ResourceStreamLocatorTest.txt   |   0
 .../resource}/ResourceStreamLocatorTest_de.txt     |   0
 .../resource}/ResourceStreamLocatorTest_de_DE.txt  |   0
 .../ResourceStreamLocatorTest_de_DE_POSIX.txt      |   0
 .../ResourceStreamLocatorTest_de__POSIX.txt        |   0
 .../util/resource/ResourceStreamLocatorTest_fr.txt |   0
 .../resource}/ResourceStreamLocatorTest_style.txt  |   0
 .../ResourceStreamLocatorTest_style_de.txt         |   0
 .../ResourceStreamLocatorTest_style_de_DE.txt      |   0
 ...ResourceStreamLocatorTest_style_de_DE_POSIX.txt |   0
 .../ResourceStreamLocatorTest_style_de__POSIX.txt  |   0
 .../util/resource/UrlResourceStreamTest.java       | 294 ++++----
 .../locator/CachingResourceStreamLocatorTest.java  |   4 +-
 .../resource/locator/ResourceNameIteratorTest.java | 362 +++++-----
 .../sourcePath}/ResourceStreamLocatorTest.txt      |   0
 .../sourcePath}/ResourceStreamLocatorTest_de.txt   |   0
 .../ResourceStreamLocatorTest_de_DE.txt            |   0
 .../ResourceStreamLocatorTest_de_DE_POSIX.txt      |   0
 .../ResourceStreamLocatorTest_de__POSIX.txt        |   0
 .../ResourceStreamLocatorTest_style.txt            |   0
 .../ResourceStreamLocatorTest_style_de.txt         |   0
 .../ResourceStreamLocatorTest_style_de_DE.txt      |   0
 ...ResourceStreamLocatorTest_style_de_DE_POSIX.txt |   0
 .../ResourceStreamLocatorTest_style_de__POSIX.txt  |   0
 .../util/string/JavaScriptStripperTest.java        |   2 +-
 .../PropertyVariableInterpolatorTest.java          | 146 ++--
 .../{ => core/util}/util/ExceptionTestBase.java    |   2 +-
 .../{ => core/util}/util/Log4jEventHistory.java    | 148 ++--
 .../util}/util/cookies/CookieUtilsTest.java        | 359 +++++-----
 .../util/cookies/CookieValuePersisterTestPage.html |  52 +-
 .../util/cookies/CookieValuePersisterTestPage.java | 140 ++--
 .../PreserveRequestCookieAfterLinkClickTest.java   |   2 +-
 .../SetCookieAndRedirectStatefullTestPage.html     |  52 +-
 .../SetCookieAndRedirectStatefullTestPage.java     | 123 ++--
 .../SetCookieAndRedirectStatelessTestPage.html     |  52 +-
 .../SetCookieAndRedirectStatelessTestPage.java     | 125 ++--
 .../util/cookies/SetCookieAndRedirectTest.java     | 142 ++--
 .../util}/util/file/WebApplicationPathTest.java    |   2 +-
 .../util}/util/markup/xhtml/WellFormedXmlTest.java |  69 +-
 .../util}/util/template/CssTemplateTest.java       |   4 +-
 .../util}/util/tester/BlockedResourceLinkPage.html |   0
 .../util}/util/tester/BlockedResourceLinkPage.java |   2 +-
 .../{ => core/util}/util/tester/CookiePage.java    |   3 +-
 .../tester/FormTesterSubmitLinkTest$TestPage.html  |   0
 .../util/tester/FormTesterSubmitLinkTest.java      |   5 +-
 .../util}/util/tester/FormTesterTest.java          |  16 +-
 .../util}/util/tester/MockAjaxFormPage.html        |   0
 .../util}/util/tester/MockAjaxFormPage.java        |   2 +-
 .../util}/util/tester/MockFormFileUploadPage.html  |   0
 .../util}/util/tester/MockFormFileUploadPage.java  |   2 +-
 .../{ => core/util}/util/tester/MockFormPage.html  |   0
 .../{ => core/util}/util/tester/MockFormPage.java  |   2 +-
 .../util}/util/tester/MockFormSubmitsPage.html     |   0
 .../util}/util/tester/MockFormSubmitsPage.java     |   2 +-
 .../MockPageAjaxSubmitLinkSubmitsWholeForm.html    |   0
 .../MockPageAjaxSubmitLinkSubmitsWholeForm.java    |   2 +-
 .../MockPageParameterPage$MockInnerClassPage.html  |   0
 .../util}/util/tester/MockPageParameterPage.html   |   0
 .../util}/util/tester/MockPageParameterPage.java   |   2 +-
 .../MockPageWithFormAndAjaxFormSubmitBehavior.html |   0
 .../MockPageWithFormAndAjaxFormSubmitBehavior.java |   2 +-
 .../util/tester/MockPageWithFormAndCheckGroup.html |   0
 .../util/tester/MockPageWithFormAndCheckGroup.java |   2 +-
 .../util/tester/MockPageWithLabelInEnclosure.html  |   0
 .../util/tester/MockPageWithLabelInEnclosure.java  |   2 +-
 .../util/tester/MockPageWithLinkAndLabel.html      |   0
 .../util/tester/MockPageWithLinkAndLabel.java      |  88 +--
 .../util}/util/tester/MockResourceLinkPage.html    |   0
 .../util}/util/tester/MockResourceLinkPage.java    |   2 +-
 .../util}/util/tester/NestedFormPage.html          |   0
 .../util}/util/tester/NestedFormPage.java          |   2 +-
 .../StartComponentInPageRedirectToRenderTest.java  |   3 +-
 .../{ => core/util}/util/tester/TagTesterTest.java |   5 +-
 .../tester/WicketTesterClickExternalLinkTest.java  |   3 +-
 .../util}/util/tester/WicketTesterCookieTest.java  |  12 +-
 .../WicketTesterLazyIsPageStatelessBase.java       |   3 +-
 ...WicketTesterLazyIsPageStatelessOnePassTest.java |   2 +-
 ...terLazyIsPageStatelessRedirectToBufferTest.java |   3 +-
 ...terLazyIsPageStatelessRedirectToRenderTest.java |   2 +-
 .../tester/WicketTesterSessionCreationTest.java    |   4 +-
 .../tester/WicketTesterSessionInvalidateTest.java  |   3 +-
 .../util}/util/tester/WicketTesterTest.java        |  29 +-
 .../{ => core/util}/util/tester/apps_1/Book.java   |   2 +-
 .../util}/util/tester/apps_1/CreateBook.html       |   0
 .../util}/util/tester/apps_1/CreateBook.java       |   2 +-
 .../util}/util/tester/apps_1/CreateBook.properties |   0
 .../util/tester/apps_1/MyMockApplication.java      |   2 +-
 .../tester/apps_1/MyMockApplication.properties     |   0
 .../tester/apps_1/MyMockApplication_de.properties  |   0
 .../tester/apps_1/MyMockApplication_nl.properties  |   0
 .../util}/util/tester/apps_1/SuccessPage.html      |   0
 .../util}/util/tester/apps_1/SuccessPage.java      |   2 +-
 .../util}/util/tester/apps_1/ViewBook.html         |   0
 .../util}/util/tester/apps_1/ViewBook.java         |   2 +-
 .../util}/util/tester/apps_2/LoginPage.html        |   0
 .../util}/util/tester/apps_2/LoginPage.java        |   2 +-
 .../util}/util/tester/apps_2/RedirectPage.html     |   0
 .../util}/util/tester/apps_2/RedirectPage.java     |   2 +-
 .../{ => core/util}/util/tester/apps_2/Test.java   |   2 +-
 .../util}/util/tester/apps_3/ChoicePage.html       |   0
 .../util}/util/tester/apps_3/ChoicePage.java       |   4 +-
 .../util}/util/tester/apps_3/FormTesterTest.java   |   4 +-
 .../util}/util/tester/apps_4/EmailPage.html        |   0
 .../util}/util/tester/apps_4/EmailPage.java        |   2 +-
 .../util}/util/tester/apps_4/EmailPage.properties  |   0
 .../util}/util/tester/apps_4/FormTesterTest.java   |   2 +-
 .../util/tester/apps_5/AjaxLinkClickTest.java      |   2 +-
 .../tester/apps_5/AjaxSubmitLinkClickTest.java     |   7 +-
 .../apps_5/MockPageWithFormAndContainedLink.html   |  26 +-
 .../apps_5/MockPageWithFormAndContainedLink.java   | 100 +--
 .../tester/apps_5/MockPageWithFormAndLink.html     |   0
 .../tester/apps_5/MockPageWithFormAndLink.java     |   2 +-
 .../util}/util/tester/apps_5/MockPageWithLink.html |   0
 .../util}/util/tester/apps_5/MockPageWithLink.java |   2 +-
 .../util}/util/tester/apps_6/LinkPage.html         |   0
 .../util}/util/tester/apps_6/LinkPage.java         | 266 +++----
 .../util}/util/tester/apps_6/ResultPage.html       |   0
 .../util}/util/tester/apps_6/ResultPage.java       |  98 +--
 .../util}/util/tester/apps_7/HomePage.html         |  12 +-
 .../util}/util/tester/apps_7/HomePage.java         |   2 +-
 .../util}/util/tester/apps_7/TestHomePage.java     |  84 +--
 .../util/tester/apps_7/WicketApplication.java      |   2 +-
 .../ComponentFeedbackResourceTestingPage.html      |   0
 .../ComponentFeedbackResourceTestingPage.java      |   4 +-
 .../tester/apps_8/TestResourceProvidingLabel.java  |   4 +-
 .../apps_8/TestResourceProvidingLabel.properties   |   0
 .../wicket/{ => core/util}/util/tester/bg.jpg      | Bin
 .../cookies/CollectAllRequestCookiesPage.java      |   2 +-
 .../util}/util/tester/cookies/EndPage.java         |   2 +-
 .../util}/util/tester/cookies/SetCookiePage.java   |   2 +-
 .../wicket/{ => core/util}/util/tester/test.html   |   0
 .../InvalidResourceSpecificationExceptionTest.java |   2 +-
 .../src/main/java/module-info.java                 |  33 +-
 .../util/license/ApacheLicenceHeaderTest.java      |   4 +-
 .../util/markup/xhtml/WellFormedXmlTest.java       |  69 +-
 .../wicket-metrics/src/main/java/module-info.java  |  38 +-
 wicket-extensions/src/main/java/module-info.java   |  74 ++
 .../util/license/ApacheLicenceHeaderTest.java      |   3 +-
 .../util/markup/xhtml/WellFormedXmlTest.java       |  69 +-
 .../src/main/java/module-info.java                 |  17 +-
 .../util/license/ApacheLicenceHeaderTest.java      |  71 +-
 .../src/main/java/module-info.java                 |  17 +-
 .../util/license/ApacheLicenceHeaderTest.java      |   3 +-
 .../src/main/java/module-info.java                 |  20 +-
 .../jmx}/util/license/ApacheLicenceHeaderTest.java |   3 +-
 .../util/license/ApacheLicenceHeaderTest.java      |  34 -
 .../src/main/java/module-info.java                 |  34 +-
 .../src/main/java/module-info.java                 |  20 +-
 .../src/main/java/module-info.java                 |  10 +
 .../src/main/java/module-info.java                 |  37 +-
 .../src/main/java/module-info.java                 |  79 +--
 .../util/license/ApacheLicenceHeaderTest.java      |   4 +-
 .../util/license/ApacheLicenceHeaderTest.java      |  34 -
 wicket-util/pom.xml                                |   1 +
 wicket-util/src/main/java/module-info.java         |  56 ++
 .../src/main/java/module-info.java                 |  16 +-
 .../util/license/ApacheLicenceHeaderTest.java      |   4 +-
 284 files changed, 3372 insertions(+), 3058 deletions(-)

diff --git a/pom.xml b/pom.xml
index 6a01a4d..5962314 100644
--- a/pom.xml
+++ b/pom.xml
@@ -142,6 +142,7 @@
 		<commons-collections.version>3.2.2</commons-collections.version>
 		<commons-collections4.version>4.4</commons-collections4.version>
 		<commons-fileupload.version>1.4</commons-fileupload.version>
+<!--		<commons-fileupload.version>0.68.0.1</commons-fileupload.version>-->
 		<commons-io.version>2.8.0</commons-io.version>
 		<commons-lang3.version>3.12.0</commons-lang3.version>
 		<guice.version>4.2.3</guice.version>
@@ -169,7 +170,7 @@
 		<mockito.version>3.11.1</mockito.version>
 		<objenesis.version>3.2</objenesis.version>
 		<openjson.version>1.0.12</openjson.version>
-		<slf4j.version>1.7.25</slf4j.version>
+		<slf4j.version>2.0.0-alpha1</slf4j.version>
 		<spring.version>5.3.8</spring.version>
 		<wagon-ssh-external.version>3.4.3</wagon-ssh-external.version>
 		<weld.version>3.1.7.Final</weld.version>
@@ -286,10 +287,12 @@
 			</dependency>
 			<dependency>
 				<groupId>commons-fileupload</groupId>
+<!--				<groupId>com.jwebmp.jpms.commons</groupId>-->
 				<artifactId>commons-fileupload</artifactId>
 				<version>${commons-fileupload.version}</version>
 				<exclusions>
 					<exclusion>
+<!--						<groupId>com.jwebmp.jpms.commons</groupId>-->
 						<groupId>commons-io</groupId>
 						<artifactId>commons-io</artifactId>
 					</exclusion>
@@ -1100,6 +1103,7 @@
 						<argLine>--add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED
 							--add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED
 							--add-modules=ALL-SYSTEM</argLine>
+						<useModulePath>false</useModulePath>
 					</configuration>
 				</plugin>
 				<plugin>
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java b/wicket-auth-roles/src/main/java/module-info.java
similarity index 57%
copy from wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
copy to wicket-auth-roles/src/main/java/module-info.java
index af4fe15..78fe988 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
+++ b/wicket-auth-roles/src/main/java/module-info.java
@@ -14,27 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
 
-abstract class AbstractVariations
-{
-	protected abstract VariationIterator<?> last();
-
-	public abstract boolean getResult();
-
-	public boolean hasNextVariation()
-	{
-		return last().hasNext();
-	}
-
-	public void nextVariation()
-	{
-		last().next();
-	}
-
-	void toString(StringBuilder sb, String label, VariationIterator<?> iterator)
-	{
-		sb.append(label).append('=').append(iterator.current()).append(',');
-	}
+module org.apache.wicket.auth.roles {
+    requires java.base;
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.request;
+    requires org.apache.wicket.core;
 
+    exports org.apache.wicket.authroles.authentication;
+    exports org.apache.wicket.authroles.authentication.pages;
+    exports org.apache.wicket.authroles.authentication.panel;
+    exports org.apache.wicket.authroles.authorization.strategies.role;
+    exports org.apache.wicket.authroles.authorization.strategies.role.annotations;
+    exports org.apache.wicket.authroles.authorization.strategies.role.metadata;
 }
diff --git a/wicket-auth-roles/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java b/wicket-auth-roles/src/test/java/org/apache/wicket/authroles/util/license/ApacheLicenceHeaderTest.java
similarity index 91%
copy from wicket-auth-roles/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
copy to wicket-auth-roles/src/test/java/org/apache/wicket/authroles/util/license/ApacheLicenceHeaderTest.java
index 6c20703..b01debd 100644
--- a/wicket-auth-roles/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ b/wicket-auth-roles/src/test/java/org/apache/wicket/authroles/util/license/ApacheLicenceHeaderTest.java
@@ -14,7 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.license;
+package org.apache.wicket.authroles.util.license;
+
+import org.apache.wicket.util.license.ApacheLicenseHeaderTestCase;
 
 /**
  * Test that the license headers are in place in this project. The tests are run from
diff --git a/wicket-auth-roles/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java b/wicket-auth-roles/src/test/java/org/apache/wicket/authroles/util/markup/xhtml/WellFormedXmlTest.java
similarity index 89%
rename from wicket-auth-roles/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
rename to wicket-auth-roles/src/test/java/org/apache/wicket/authroles/util/markup/xhtml/WellFormedXmlTest.java
index 88d9025..0902d1e 100644
--- a/wicket-auth-roles/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
+++ b/wicket-auth-roles/src/test/java/org/apache/wicket/authroles/util/markup/xhtml/WellFormedXmlTest.java
@@ -1,34 +1,35 @@
-/*
- * 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.util.markup.xhtml;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * Checks that the html markup files are well formed xml-s.
- * 
- * @author akiraly
- */
-public class WellFormedXmlTest extends WellFormedXmlTestCase
-{
-	@Test
-	@Override
-	public void markupFiles()
-	{
-		super.markupFiles();
-	}
-}
+/*
+ * 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.authroles.util.markup.xhtml;
+
+import org.apache.wicket.util.markup.xhtml.WellFormedXmlTestCase;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Checks that the html markup files are well formed xml-s.
+ * 
+ * @author akiraly
+ */
+public class WellFormedXmlTest extends WellFormedXmlTestCase
+{
+	@Test
+	@Override
+	public void markupFiles()
+	{
+		super.markupFiles();
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication.java b/wicket-bean-validation/src/main/java/module-info.java
similarity index 80%
copy from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication.java
copy to wicket-bean-validation/src/main/java/module-info.java
index e094a7b..ce46fc1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication.java
+++ b/wicket-bean-validation/src/main/java/module-info.java
@@ -14,13 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_1;
 
-import org.apache.wicket.mock.MockApplication;
+module org.apache.wicket.bean.validation {
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.core;
+    requires java.validation;
 
-/**
- * @author Juergen Donnerstag
- */
-public class MyMockApplication extends MockApplication
-{
+    exports org.apache.wicket.bean.validation;
 }
diff --git a/wicket-auth-roles/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/util/license/ApacheLicenceHeaderTest.java
similarity index 91%
rename from wicket-auth-roles/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
rename to wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/util/license/ApacheLicenceHeaderTest.java
index 6c20703..1ba4807 100644
--- a/wicket-auth-roles/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/util/license/ApacheLicenceHeaderTest.java
@@ -14,7 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.license;
+package org.apache.wicket.bean.validation.util.license;
+
+import org.apache.wicket.util.license.ApacheLicenseHeaderTestCase;
 
 /**
  * Test that the license headers are in place in this project. The tests are run from
diff --git a/wicket-extensions/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/util/markup/xhtml/WellFormedXmlTest.java
similarity index 89%
copy from wicket-extensions/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
copy to wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/util/markup/xhtml/WellFormedXmlTest.java
index 88d9025..07158b0 100644
--- a/wicket-extensions/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
+++ b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/util/markup/xhtml/WellFormedXmlTest.java
@@ -1,34 +1,35 @@
-/*
- * 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.util.markup.xhtml;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * Checks that the html markup files are well formed xml-s.
- * 
- * @author akiraly
- */
-public class WellFormedXmlTest extends WellFormedXmlTestCase
-{
-	@Test
-	@Override
-	public void markupFiles()
-	{
-		super.markupFiles();
-	}
-}
+/*
+ * 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.bean.validation.util.markup.xhtml;
+
+import org.apache.wicket.util.markup.xhtml.WellFormedXmlTestCase;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Checks that the html markup files are well formed xml-s.
+ * 
+ * @author akiraly
+ */
+public class WellFormedXmlTest extends WellFormedXmlTestCase
+{
+	@Test
+	@Override
+	public void markupFiles()
+	{
+		super.markupFiles();
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java b/wicket-cdi/src/main/java/module-info.java
similarity index 70%
copy from wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java
copy to wicket-cdi/src/main/java/module-info.java
index fcfc1c5..3db04a1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java
+++ b/wicket-cdi/src/main/java/module-info.java
@@ -14,17 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.lang;
 
-/**
- * @author jcompagner
- */
-public class Person2 extends Person
-{
+module org.apache.wicket.cdi {
+    requires java.annotation;
+    requires java.naming;
+    requires jakarta.enterprise.cdi.api;
+    requires jakarta.inject.api;
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.request;
+    requires org.apache.wicket.core;
+    requires org.slf4j;
 
-	@Override
-	public String getName()
-	{
-		return (String)super.getName();
-	}
+    exports org.apache.wicket.cdi;
 }
diff --git a/wicket-core/src/main/java/module-info.java b/wicket-core/src/main/java/module-info.java
new file mode 100644
index 0000000..4e2ca67
--- /dev/null
+++ b/wicket-core/src/main/java/module-info.java
@@ -0,0 +1,142 @@
+/*
+ * 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.
+ */
+
+module org.apache.wicket.core {
+    requires java.base;
+    requires java.instrument;
+    requires java.desktop;
+    requires java.sql;
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.request;
+    requires org.apache.commons.io;
+    requires org.apache.commons.collections4;
+    requires commons.fileupload;
+    requires org.slf4j;
+    requires javax.servlet.api;
+    requires org.danekja.jdk.serializable.functional;
+    requires com.github.openjson;
+    requires org.junit.jupiter.api;
+
+    provides org.apache.wicket.IInitializer with org.apache.wicket.Initializer;
+    provides org.apache.wicket.resource.FileSystemPathService with org.apache.wicket.resource.FileSystemJarPathService;
+
+    exports org.apache.wicket;
+    exports org.apache.wicket.ajax;
+    exports org.apache.wicket.ajax.attributes;
+    exports org.apache.wicket.ajax.form;
+    exports org.apache.wicket.ajax.json;
+    exports org.apache.wicket.ajax.markup.html;
+    exports org.apache.wicket.ajax.markup.html.form;
+    exports org.apache.wicket.ajax.markup.html.navigation.paging;
+    exports org.apache.wicket.application;
+    exports org.apache.wicket.authentication;
+    exports org.apache.wicket.authentication.strategy;
+    exports org.apache.wicket.authorization;
+    exports org.apache.wicket.authorization.strategies;
+    exports org.apache.wicket.authorization.strategies.action;
+    exports org.apache.wicket.authorization.strategies.page;
+    exports org.apache.wicket.behavior;
+    exports org.apache.wicket.coep;
+    exports org.apache.wicket.coop;
+    exports org.apache.wicket.core.random;
+    exports org.apache.wicket.core.request;
+    exports org.apache.wicket.core.request.handler;
+    exports org.apache.wicket.core.request.handler.logger;
+    exports org.apache.wicket.core.request.mapper;
+    exports org.apache.wicket.core.util.crypt;
+    exports org.apache.wicket.core.util.file;
+    exports org.apache.wicket.core.util.lang;
+    exports org.apache.wicket.core.util.objects.checker;
+    exports org.apache.wicket.core.util.resource;
+    exports org.apache.wicket.core.util.resource.locator;
+    exports org.apache.wicket.core.util.resource.locator.caching;
+    exports org.apache.wicket.core.util.string;
+    exports org.apache.wicket.core.util.string.interpolator;
+    exports org.apache.wicket.core.util.watch;
+    exports org.apache.wicket.csp;
+    exports org.apache.wicket.css;
+    exports org.apache.wicket.event;
+    exports org.apache.wicket.feedback;
+    exports org.apache.wicket.javascript;
+    exports org.apache.wicket.markup;
+    exports org.apache.wicket.markup.head;
+    exports org.apache.wicket.markup.head.filter;
+    exports org.apache.wicket.markup.head.internal;
+    exports org.apache.wicket.markup.html;
+    exports org.apache.wicket.markup.html.basic;
+    exports org.apache.wicket.markup.html.border;
+    exports org.apache.wicket.markup.html.debug;
+    exports org.apache.wicket.markup.html.form;
+    exports org.apache.wicket.markup.html.form.upload;
+    exports org.apache.wicket.markup.html.form.validation;
+    exports org.apache.wicket.markup.html.image;
+    exports org.apache.wicket.markup.html.image.resource;
+    exports org.apache.wicket.markup.html.include;
+    exports org.apache.wicket.markup.html.internal;
+    exports org.apache.wicket.markup.html.link;
+    exports org.apache.wicket.markup.html.list;
+    exports org.apache.wicket.markup.html.media;
+    exports org.apache.wicket.markup.html.media.audio;
+    exports org.apache.wicket.markup.html.media.video;
+    exports org.apache.wicket.markup.html.navigation.paging;
+    exports org.apache.wicket.markup.html.pages;
+    exports org.apache.wicket.markup.html.panel;
+    exports org.apache.wicket.markup.loader;
+    exports org.apache.wicket.markup.parser;
+    exports org.apache.wicket.markup.parser.filter;
+    exports org.apache.wicket.markup.renderStrategy;
+    exports org.apache.wicket.markup.repeater;
+    exports org.apache.wicket.markup.repeater.data;
+    exports org.apache.wicket.markup.repeater.util;
+    exports org.apache.wicket.markup.resolver;
+    exports org.apache.wicket.markup.transformer;
+    exports org.apache.wicket.mock;
+    exports org.apache.wicket.model;
+    exports org.apache.wicket.model.util;
+    exports org.apache.wicket.page;
+    exports org.apache.wicket.pageStore;
+    exports org.apache.wicket.pageStore.crypt;
+    exports org.apache.wicket.pageStore.disk;
+    exports org.apache.wicket.protocol.http;
+    exports org.apache.wicket.protocol.http.mock;
+    exports org.apache.wicket.protocol.http.request;
+    exports org.apache.wicket.protocol.http.servlet;
+    exports org.apache.wicket.protocol.https;
+    exports org.apache.wicket.request.component;
+    exports org.apache.wicket.request.cycle;
+    exports org.apache.wicket.request.handler.render;
+    exports org.apache.wicket.request.handler.resource;
+    exports org.apache.wicket.request.resource;
+    exports org.apache.wicket.request.resource.caching;
+    exports org.apache.wicket.request.resource.caching.version;
+    exports org.apache.wicket.resource;
+    exports org.apache.wicket.resource.bundles;
+    exports org.apache.wicket.resource.loader;
+    exports org.apache.wicket.response;
+    exports org.apache.wicket.response.filter;
+    exports org.apache.wicket.serialize;
+    exports org.apache.wicket.serialize.java;
+    exports org.apache.wicket.session;
+    exports org.apache.wicket.settings;
+    exports org.apache.wicket.util.cookies;
+    exports org.apache.wicket.util.image;
+    exports org.apache.wicket.util.reference;
+    exports org.apache.wicket.util.template;
+    exports org.apache.wicket.util.tester;
+    exports org.apache.wicket.validation;
+    exports org.apache.wicket.validation.validator;
+}
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java b/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
index 698d446..04a5c56 100644
--- a/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
+++ b/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
@@ -18,7 +18,6 @@ package org.apache.wicket.request.resource;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.sql.Time;
 import java.time.Duration;
 import java.time.Instant;
 import java.time.temporal.ChronoUnit;
@@ -950,7 +949,7 @@ public abstract class AbstractResource implements IResource
 		 * @param stream
 		 *            input stream
 		 */
-		protected final void writeStream(Attributes attributes, InputStream stream) throws IOException
+		protected void writeStream(Attributes attributes, InputStream stream) throws IOException
 		{
 			final Response response = attributes.getResponse();
 			Streams.copy(stream, response.getOutputStream());
diff --git a/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitBehaviorTest.java b/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitBehaviorTest.java
index 0628908..f38a75f 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitBehaviorTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/ajax/form/AjaxFormSubmitBehaviorTest.java
@@ -22,7 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.util.tester.FormTester;
-import org.apache.wicket.util.tester.NestedFormPage;
+import org.apache.wicket.core.util.util.tester.NestedFormPage;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
@@ -107,4 +107,4 @@ class AjaxFormSubmitBehaviorTest extends WicketTestCase
 			get("outer:inner").replaceWith(inner);
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/PageIdPolicyTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/PageIdPolicyTest.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/PageIdPolicyTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/PageIdPolicyTest.java
index b0895ed..3e2e558 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/PageIdPolicyTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/PageIdPolicyTest.java
@@ -1,170 +1,170 @@
-/*
- * 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.request.handler;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.nio.charset.Charset;
-
-import org.apache.wicket.IPageManagerProvider;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.ajax.AjaxEventBehavior;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.markup.IMarkupResourceStreamProvider;
-import org.apache.wicket.markup.html.WebComponent;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.mock.MockApplication;
-import org.apache.wicket.page.IManageablePage;
-import org.apache.wicket.page.IPageManager;
-import org.apache.wicket.page.PageManager;
-import org.apache.wicket.pageStore.IPageContext;
-import org.apache.wicket.pageStore.InMemoryPageStore;
-import org.apache.wicket.pageStore.RequestPageStore;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.util.resource.IResourceStream;
-import org.apache.wicket.util.resource.StringResourceStream;
-import org.apache.wicket.util.tester.WicketTester;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-/**
- * @author Pedro Santos
- */
-public class PageIdPolicyTest
-{
-	private WicketTester tester;
-	private InMemoryPageStore pageStore;
-	private MockApplication application;
-	private int storeCount;
-
-	/**
-	 * Asserting that page get touched in an AJAX request that is only repaint its children. <br />
-	 * In this case no new page id is being generated and the old page is touched and stored again.<br />
-	 * 
-	 * @see <a href="https://issues.apache.org/jira/browse/WICKET-3667">WICKET-3667</a>
-	 */
-	@Test
-	void testPageGetsTouchedInAjaxRequest()
-	{
-		TestPage testPage = new TestPage();
-		tester.startPage(TestPage.class);
-		int referenceStoreCount = storeCount;
-		tester.executeAjaxUrl(testPage.getAjaxUrl(tester.getRequest().getCharacterEncoding()));
-		// the page should be stored even for ajax requests
-		assertEquals(referenceStoreCount + 1, storeCount);
-	}
-
-	/**
-	 * 
-	 */
-	@Test
-	void testPageIdDontGetIncreasedInAjaxRequest()
-	{
-		TestPage testPage = new TestPage();
-		tester.startPage(testPage);
-		String testPageId = testPage.getId();
-		tester.executeAjaxUrl(testPage.getAjaxUrl(tester.getRequest().getCharacterEncoding()));
-		assertEquals(testPageId, testPage.getId());
-		assertTrue(testPage.ajaxCallbackExecuted);
-	}
-
-	@BeforeEach
-	void setUp() throws Exception
-	{
-		application = new MockApplication();
-		pageStore = new InMemoryPageStore("test", Integer.MAX_VALUE)
-		{
-			@Override
-			public void addPage(IPageContext context, IManageablePage page)
-			{
-				super.addPage(context, page);
-				storeCount++;
-			}
-		};
-		tester = new WicketTester(application)
-		{
-			@Override
-			protected IPageManagerProvider newTestPageManagerProvider()
-			{
-				return new IPageManagerProvider()
-				{
-					@Override
-					public IPageManager get()
-					{
-						return new PageManager(new RequestPageStore(pageStore));
-					}
-				};
-			}
-		};
-	}
-
-	@AfterEach
-	void tearDown() throws Exception
-	{
-		tester.destroy();
-	}
-
-	/** */
-	public static class TestPage extends WebPage implements IMarkupResourceStreamProvider
-	{
-		/** */
-		private static final long serialVersionUID = 1L;
-		AjaxEventBehavior eventBehavior;
-		boolean ajaxCallbackExecuted;
-
-		/**
-		 * Construct.
-		 */
-		public TestPage()
-		{
-			WebComponent component;
-			component = new WebComponent("component");
-			component.add(eventBehavior = new AjaxEventBehavior("click")
-			{
-				/** */
-				private static final long serialVersionUID = 1L;
-
-				@Override
-				protected void onEvent(AjaxRequestTarget target)
-				{
-					ajaxCallbackExecuted = true;
-				}
-			});
-			add(component);
-		}
-
-		/**
-		 * @param encoding
-		 * @return ajaxUrl
-		 */
-		public Url getAjaxUrl(String encoding)
-		{
-			return Url.parse(eventBehavior.getCallbackUrl().toString(), Charset.forName(encoding));
-		}
-
-		@Override
-		public IResourceStream getMarkupResourceStream(MarkupContainer container,
-			Class<?> containerClass)
-		{
-			return new StringResourceStream(
-				"<html><body><a wicket:id=\"component\"></a></body></html>");
-		}
-
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.handler;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.nio.charset.Charset;
+
+import org.apache.wicket.IPageManagerProvider;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AjaxEventBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebComponent;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.mock.MockApplication;
+import org.apache.wicket.page.IManageablePage;
+import org.apache.wicket.page.IPageManager;
+import org.apache.wicket.page.PageManager;
+import org.apache.wicket.pageStore.IPageContext;
+import org.apache.wicket.pageStore.InMemoryPageStore;
+import org.apache.wicket.pageStore.RequestPageStore;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author Pedro Santos
+ */
+public class PageIdPolicyTest
+{
+	private WicketTester tester;
+	private InMemoryPageStore pageStore;
+	private MockApplication application;
+	private int storeCount;
+
+	/**
+	 * Asserting that page get touched in an AJAX request that is only repaint its children. <br />
+	 * In this case no new page id is being generated and the old page is touched and stored again.<br />
+	 * 
+	 * @see <a href="https://issues.apache.org/jira/browse/WICKET-3667">WICKET-3667</a>
+	 */
+	@Test
+	void testPageGetsTouchedInAjaxRequest()
+	{
+		TestPage testPage = new TestPage();
+		tester.startPage(TestPage.class);
+		int referenceStoreCount = storeCount;
+		tester.executeAjaxUrl(testPage.getAjaxUrl(tester.getRequest().getCharacterEncoding()));
+		// the page should be stored even for ajax requests
+		assertEquals(referenceStoreCount + 1, storeCount);
+	}
+
+	/**
+	 * 
+	 */
+	@Test
+	void testPageIdDontGetIncreasedInAjaxRequest()
+	{
+		TestPage testPage = new TestPage();
+		tester.startPage(testPage);
+		String testPageId = testPage.getId();
+		tester.executeAjaxUrl(testPage.getAjaxUrl(tester.getRequest().getCharacterEncoding()));
+		assertEquals(testPageId, testPage.getId());
+		assertTrue(testPage.ajaxCallbackExecuted);
+	}
+
+	@BeforeEach
+	void setUp() throws Exception
+	{
+		application = new MockApplication();
+		pageStore = new InMemoryPageStore("test", Integer.MAX_VALUE)
+		{
+			@Override
+			public void addPage(IPageContext context, IManageablePage page)
+			{
+				super.addPage(context, page);
+				storeCount++;
+			}
+		};
+		tester = new WicketTester(application)
+		{
+			@Override
+			protected IPageManagerProvider newTestPageManagerProvider()
+			{
+				return new IPageManagerProvider()
+				{
+					@Override
+					public IPageManager get()
+					{
+						return new PageManager(new RequestPageStore(pageStore));
+					}
+				};
+			}
+		};
+	}
+
+	@AfterEach
+	void tearDown() throws Exception
+	{
+		tester.destroy();
+	}
+
+	/** */
+	public static class TestPage extends WebPage implements IMarkupResourceStreamProvider
+	{
+		/** */
+		private static final long serialVersionUID = 1L;
+		AjaxEventBehavior eventBehavior;
+		boolean ajaxCallbackExecuted;
+
+		/**
+		 * Construct.
+		 */
+		public TestPage()
+		{
+			WebComponent component;
+			component = new WebComponent("component");
+			component.add(eventBehavior = new AjaxEventBehavior("click")
+			{
+				/** */
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				protected void onEvent(AjaxRequestTarget target)
+				{
+					ajaxCallbackExecuted = true;
+				}
+			});
+			add(component);
+		}
+
+		/**
+		 * @param encoding
+		 * @return ajaxUrl
+		 */
+		public Url getAjaxUrl(String encoding)
+		{
+			return Url.parse(eventBehavior.getCallbackUrl().toString(), Charset.forName(encoding));
+		}
+
+		@Override
+		public IResourceStream getMarkupResourceStream(MarkupContainer container,
+			Class<?> containerClass)
+		{
+			return new StringResourceStream(
+				"<html><body><a wicket:id=\"component\"></a></body></html>");
+		}
+
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/PageProviderTest.java
similarity index 99%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/PageProviderTest.java
index 252760e..235dbaf 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/PageProviderTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/PageProviderTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler;
+package org.apache.wicket.core.request.handler;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/AbstractVariations.java
similarity index 95%
copy from wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
copy to wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/AbstractVariations.java
index af4fe15..66ef83c 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/AbstractVariations.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
+package org.apache.wicket.core.request.handler.render;
 
 abstract class AbstractVariations
 {
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRedirectToTargetUrl.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/ShouldRedirectToTargetUrl.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRedirectToTargetUrl.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/ShouldRedirectToTargetUrl.java
index 55486d6..546f938 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRedirectToTargetUrl.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/ShouldRedirectToTargetUrl.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
+package org.apache.wicket.core.request.handler.render;
 
 import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
 import org.apache.wicket.request.Url;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRenderPageAndWriteResponseVariations.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/ShouldRenderPageAndWriteResponseVariations.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRenderPageAndWriteResponseVariations.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/ShouldRenderPageAndWriteResponseVariations.java
index 4a7ed37..deda4d7 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/ShouldRenderPageAndWriteResponseVariations.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/ShouldRenderPageAndWriteResponseVariations.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
+package org.apache.wicket.core.request.handler.render;
 
 import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
 import org.apache.wicket.request.Url;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/SkipRenderWithSetResponsePageTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/SkipRenderWithSetResponsePageTest.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/render/SkipRenderWithSetResponsePageTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/SkipRenderWithSetResponsePageTest.java
index 885c8ca..d1cecd7 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/SkipRenderWithSetResponsePageTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/SkipRenderWithSetResponsePageTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
+package org.apache.wicket.core.request.handler.render;
 
 import static org.junit.jupiter.api.Assertions.fail;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/StatelessPageManipulatingPageParametersTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/StatelessPageManipulatingPageParametersTest.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/render/StatelessPageManipulatingPageParametersTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/StatelessPageManipulatingPageParametersTest.java
index efb11f2..54bc4b9 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/StatelessPageManipulatingPageParametersTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/StatelessPageManipulatingPageParametersTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
+package org.apache.wicket.core.request.handler.render;
 
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.IMarkupResourceStreamProvider;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/TestPageRenderer.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/TestPageRenderer.java
similarity index 84%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/render/TestPageRenderer.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/TestPageRenderer.java
index bed615e..b285e17 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/TestPageRenderer.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/TestPageRenderer.java
@@ -14,13 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
+package org.apache.wicket.core.request.handler.render;
 
 import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
 import org.apache.wicket.core.request.handler.RenderPageRequestHandler.RedirectPolicy;
 import org.apache.wicket.protocol.http.BufferedWebResponse;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.handler.render.WebPageRenderer;
 
 /**
  * Configures common methods which are used by all tests
@@ -43,6 +44,16 @@ class TestPageRenderer extends WebPageRenderer
 	}
 
 	@Override
+	public boolean shouldRedirectToTargetUrl(RequestCycle cycle, Url currentUrl, Url targetUrl) {
+		return super.shouldRedirectToTargetUrl(cycle, currentUrl, targetUrl);
+	}
+
+	@Override
+	public boolean shouldRenderPageAndWriteResponse(RequestCycle cycle, Url currentUrl, Url targetUrl) {
+		return super.shouldRenderPageAndWriteResponse(cycle, currentUrl, targetUrl);
+	}
+
+	@Override
 	protected BufferedWebResponse renderPage(Url targetUrl, RequestCycle requestCycle)
 	{
 		BufferedWebResponse webResponse = super.renderPage(targetUrl, requestCycle);
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/TestVariations.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/TestVariations.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/render/TestVariations.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/TestVariations.java
index 4473c73..6b87173 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/TestVariations.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/TestVariations.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
+package org.apache.wicket.core.request.handler.render;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/Variation.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/Variation.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/render/Variation.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/Variation.java
index 8bc014e..0d3955d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/Variation.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/Variation.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
+package org.apache.wicket.core.request.handler.render;
 
 import java.util.Arrays;
 import java.util.List;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/VariationIterator.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/VariationIterator.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/render/VariationIterator.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/VariationIterator.java
index 14480ba..8014ff3 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/VariationIterator.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/VariationIterator.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
+package org.apache.wicket.core.request.handler.render;
 
 import java.util.Iterator;
 import java.util.NoSuchElementException;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/WebPageRendererTest.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/WebPageRendererTest.java
index caea667..b8244cd 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/WebPageRendererTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/render/WebPageRendererTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
+package org.apache.wicket.core.request.handler.render;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -38,8 +38,10 @@ import org.apache.wicket.request.Url;
 import org.apache.wicket.request.UrlRenderer;
 import org.apache.wicket.request.component.IRequestablePage;
 import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.handler.render.PageRenderer;
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.http.WebResponse;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -612,7 +614,7 @@ class WebPageRendererTest
 		renderer.newPageInstance = true;
 		renderer.pageStateless = true;
 
-		assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
+		Assertions.assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
 			Url.parse("test"), Url.parse("test")));
 
 		renderer.ajax = false;
@@ -622,7 +624,7 @@ class WebPageRendererTest
 		renderer.newPageInstance = false;
 		renderer.pageStateless = false;
 
-		assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
+		Assertions.assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
 			Url.parse("test1"), Url.parse("test2")));
 
 		// 	or
@@ -634,7 +636,7 @@ class WebPageRendererTest
 		renderer.ajax = false;
 		renderer.onePassRender = true;
 
-		assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
+		Assertions.assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
 			Url.parse("test1"), Url.parse("test2")));
 
 		renderer.redirectPolicy = RedirectPolicy.ALWAYS_REDIRECT;
@@ -643,21 +645,21 @@ class WebPageRendererTest
 		renderer.newPageInstance = false;
 		renderer.pageStateless = false;
 
-		assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
+		Assertions.assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
 			Url.parse("test"), Url.parse("test")));
 
 		//	or
 		//		the targetUrl matches current url and it's redirect-to-render
 		renderer.redirectToRender = true;
 
-		assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
+		Assertions.assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
 			Url.parse("test"), Url.parse("test")));
 
 		renderer.pageStateless = true;
 		renderer.newPageInstance = true;
 		renderer.redirectToRender = true;
 
-		assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
+		Assertions.assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
 			Url.parse("test"), Url.parse("test")));
 
 		//	or
@@ -672,7 +674,7 @@ class WebPageRendererTest
 		renderer.newPageInstance = true;
 		renderer.pageStateless = true;
 
-		assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
+		Assertions.assertTrue(renderer.shouldRenderPageAndWriteResponse(requestCycle,
 			Url.parse("test1"), Url.parse("test2")));
 
 	}
@@ -704,14 +706,14 @@ class WebPageRendererTest
 		renderer.newPageInstance = true;
 		renderer.pageStateless = true;
 
-		assertFalse(renderer.shouldRenderPageAndWriteResponse(requestCycle,
+		Assertions.assertFalse(renderer.shouldRenderPageAndWriteResponse(requestCycle,
 			Url.parse("test1"), Url.parse("test2")));
 
 		renderer.redirectToRender = false;
 		renderer.newPageInstance = false;
 		renderer.pageStateless = false;
 
-		assertFalse(renderer.shouldRenderPageAndWriteResponse(requestCycle,
+		Assertions.assertFalse(renderer.shouldRenderPageAndWriteResponse(requestCycle,
 			Url.parse("test"), Url.parse("test")));
 	}
 
@@ -794,7 +796,7 @@ class WebPageRendererTest
 		renderer.pageStateless = false;
 		renderer.sessionTemporary = false;
 
-		assertTrue(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test1"),
+		Assertions.assertTrue(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test1"),
 			Url.parse("test2")));
 
 		// 	or
@@ -802,7 +804,7 @@ class WebPageRendererTest
 		renderer.redirectPolicy = RedirectPolicy.AUTO_REDIRECT;
 		renderer.redirectToRender = true;
 
-		assertTrue(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test1"),
+		Assertions.assertTrue(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test1"),
 			Url.parse("test2")));
 
 		//	or
@@ -810,7 +812,7 @@ class WebPageRendererTest
 		renderer.redirectToRender = false;
 		renderer.ajax = true;
 
-		assertTrue(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test"),
+		Assertions.assertTrue(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test"),
 			Url.parse("test")));
 
 		// 	or
@@ -821,14 +823,14 @@ class WebPageRendererTest
 		renderer.ajax = false;
 		renderer.newPageInstance = true;
 
-		assertTrue(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test1"),
+		Assertions.assertTrue(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test1"),
 			Url.parse("test2")));
 
 		renderer.newPageInstance = false;
 		renderer.sessionTemporary = true;
 		renderer.pageStateless = true;
 
-		assertTrue(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test1"),
+		Assertions.assertTrue(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test1"),
 			Url.parse("test2")));
 		// just redirect
 	}
@@ -857,7 +859,7 @@ class WebPageRendererTest
 		renderer.pageStateless=false;
 		renderer.sessionTemporary=false;
 
-		assertFalse(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test1"),
+		Assertions.assertFalse(renderer.shouldRedirectToTargetUrl(requestCycle, Url.parse("test1"),
 				Url.parse("test2")));
 	}
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/resource/ResourceAuthorizationTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/resource/ResourceAuthorizationTest.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/resource/ResourceAuthorizationTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/handler/resource/ResourceAuthorizationTest.java
index 36db7c5..a678229 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/resource/ResourceAuthorizationTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/handler/resource/ResourceAuthorizationTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.resource;
+package org.apache.wicket.core.request.handler.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
diff --git a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapperTest.java
index 3af1c62..a08d93e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapperTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/mapper/AbstractBookmarkableMapperTest.java
@@ -29,7 +29,7 @@ import org.apache.wicket.request.Request;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.mapper.info.PageInfo;
 import org.apache.wicket.util.tester.WicketTestCase;
-import org.apache.wicket.util.tester.WicketTesterLazyIsPageStatelessRedirectToBufferTest.EmptyPage;
+import org.apache.wicket.core.util.util.tester.WicketTesterLazyIsPageStatelessRedirectToBufferTest.EmptyPage;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderApplication.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/MultiRequestCycleListenerCallOrderApplication.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderApplication.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/MultiRequestCycleListenerCallOrderApplication.java
index aa057e7..dd21721 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderApplication.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/MultiRequestCycleListenerCallOrderApplication.java
@@ -14,13 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
+package org.apache.wicket.core.request.request.cycle;
 
 import java.util.ArrayList;
 
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.Url;
+import org.apache.wicket.request.cycle.IRequestCycleListener;
+import org.apache.wicket.request.cycle.RequestCycle;
 
 class MultiRequestCycleListenerCallOrderApplication extends WebApplication
 {
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderPage.html b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/MultiRequestCycleListenerCallOrderPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/MultiRequestCycleListenerCallOrderPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderPage.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/MultiRequestCycleListenerCallOrderPage.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/MultiRequestCycleListenerCallOrderPage.java
index 065caab..7ea37e9 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/MultiRequestCycleListenerCallOrderPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
+package org.apache.wicket.core.request.request.cycle;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/MultiRequestCycleListenerCallOrderTest.java
similarity index 99%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/MultiRequestCycleListenerCallOrderTest.java
index f0b5723..fcac76d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/MultiRequestCycleListenerCallOrderTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
+package org.apache.wicket.core.request.request.cycle;
 
 import static java.util.Arrays.asList;
 import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/PageRequestHandlerTrackerTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/PageRequestHandlerTrackerTest.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/PageRequestHandlerTrackerTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/PageRequestHandlerTrackerTest.java
index ce684c5..23b3768 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/PageRequestHandlerTrackerTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/PageRequestHandlerTrackerTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
+package org.apache.wicket.core.request.request.cycle;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -29,6 +29,9 @@ import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.Url;
+import org.apache.wicket.request.cycle.IRequestCycleListener;
+import org.apache.wicket.request.cycle.PageRequestHandlerTracker;
+import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.mapper.IRequestMapperDelegate;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.StringResourceStream;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerDetachOrderTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestCycleListenerDetachOrderTest.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerDetachOrderTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestCycleListenerDetachOrderTest.java
index 70e82f7..eb04ebd 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerDetachOrderTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestCycleListenerDetachOrderTest.java
@@ -1,99 +1,101 @@
-/*
- * 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.request.cycle;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.markup.IMarkupResourceStreamProvider;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.util.resource.IResourceStream;
-import org.apache.wicket.util.resource.StringResourceStream;
-import org.apache.wicket.util.tester.WicketTester;
-import org.junit.jupiter.api.Test;
-
-
-/**
- * Tests that pages are detached before {@link IRequestCycleListener#onDetach(RequestCycle)} are
- * invoked
- * 
- * WICKET-4181
- * 
- * @author igor
- */
-public class RequestCycleListenerDetachOrderTest
-{
-	@Test
-    void pageDetachedBeforeListener()
-	{
-		List<Event> events = new ArrayList<Event>();
-
-		WicketTester tester = new WicketTester();
-		tester.getApplication().getRequestCycleListeners().add(new TestListener(events));
-		tester.startPage(new TestPage(events));
-
-		assertEquals(Event.PAGE_DETACHED, events.get(0));
-		assertEquals(Event.LISTENER_DETACHED, events.get(1));
-	}
-
-	private static class TestListener implements IRequestCycleListener
-	{
-		private final List<Event> events;
-
-		TestListener(List<Event> events)
-		{
-			this.events = events;
-		}
-
-		@Override
-		public void onDetach(RequestCycle cycle)
-		{
-			events.add(Event.LISTENER_DETACHED);
-		}
-	}
-
-	private class TestPage extends WebPage implements IMarkupResourceStreamProvider
-	{
-		private final List<Event> events;
-
-		TestPage(List<Event> events)
-		{
-			this.events = events;
-		}
-
-		@Override
-		protected void onDetach()
-		{
-			super.onDetach();
-			events.add(Event.PAGE_DETACHED);
-		}
-
-		@Override
-		public IResourceStream getMarkupResourceStream(MarkupContainer container,
-			Class<?> containerClass)
-		{
-			return new StringResourceStream("<html></html>");
-		}
-	}
-
-	private static enum Event {
-		PAGE_DETACHED, LISTENER_DETACHED
-	};
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.request.cycle;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.request.cycle.IRequestCycleListener;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.apache.wicket.util.tester.WicketTester;
+import org.junit.jupiter.api.Test;
+
+
+/**
+ * Tests that pages are detached before {@link IRequestCycleListener#onDetach(RequestCycle)} are
+ * invoked
+ * 
+ * WICKET-4181
+ * 
+ * @author igor
+ */
+public class RequestCycleListenerDetachOrderTest
+{
+	@Test
+    void pageDetachedBeforeListener()
+	{
+		List<Event> events = new ArrayList<Event>();
+
+		WicketTester tester = new WicketTester();
+		tester.getApplication().getRequestCycleListeners().add(new TestListener(events));
+		tester.startPage(new TestPage(events));
+
+		assertEquals(Event.PAGE_DETACHED, events.get(0));
+		assertEquals(Event.LISTENER_DETACHED, events.get(1));
+	}
+
+	private static class TestListener implements IRequestCycleListener
+	{
+		private final List<Event> events;
+
+		TestListener(List<Event> events)
+		{
+			this.events = events;
+		}
+
+		@Override
+		public void onDetach(RequestCycle cycle)
+		{
+			events.add(Event.LISTENER_DETACHED);
+		}
+	}
+
+	private class TestPage extends WebPage implements IMarkupResourceStreamProvider
+	{
+		private final List<Event> events;
+
+		TestPage(List<Event> events)
+		{
+			this.events = events;
+		}
+
+		@Override
+		protected void onDetach()
+		{
+			super.onDetach();
+			events.add(Event.PAGE_DETACHED);
+		}
+
+		@Override
+		public IResourceStream getMarkupResourceStream(MarkupContainer container,
+			Class<?> containerClass)
+		{
+			return new StringResourceStream("<html></html>");
+		}
+	}
+
+	private static enum Event {
+		PAGE_DETACHED, LISTENER_DETACHED
+	};
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestCycleListenerTest.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestCycleListenerTest.java
index caa89f9..438d44d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleListenerTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestCycleListenerTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
+package org.apache.wicket.core.request.request.cycle;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -37,6 +37,9 @@ import org.apache.wicket.request.Request;
 import org.apache.wicket.request.RequestHandlerExecutor.ReplaceHandlerException;
 import org.apache.wicket.request.Response;
 import org.apache.wicket.request.Url;
+import org.apache.wicket.request.cycle.IRequestCycleListener;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.cycle.RequestCycleContext;
 import org.apache.wicket.request.handler.EmptyRequestHandler;
 import org.apache.wicket.resource.DummyApplication;
 import org.junit.jupiter.api.AfterEach;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestCycleUrlForTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestCycleUrlForTest.java
index 2602643..96afdb2 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestCycleUrlForTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestCycleUrlForTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
+package org.apache.wicket.core.request.request.cycle;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.argThat;
@@ -28,6 +28,8 @@ import org.apache.wicket.request.IRequestMapper;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.Response;
 import org.apache.wicket.request.Url;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.cycle.RequestCycleContext;
 import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
 import org.apache.wicket.request.handler.resource.ResourceRequestHandler;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestHandlerExecutorTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestHandlerExecutorTest.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestHandlerExecutorTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestHandlerExecutorTest.java
index eb42129..42b1eb7 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RequestHandlerExecutorTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RequestHandlerExecutorTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
+package org.apache.wicket.core.request.request.cycle;
 
 import org.apache.wicket.request.IRequestCycle;
 import org.apache.wicket.request.IRequestHandler;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderAjaxPage.html b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderAjaxPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderAjaxPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderAjaxPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderAjaxPage.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderAjaxPage.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderAjaxPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderAjaxPage.java
index 928fc34..c049b7e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderAjaxPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderAjaxPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
+package org.apache.wicket.core.request.request.cycle;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.form.AjaxFormValidatingBehavior;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderPage.html b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderPage.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderPage.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderPage.java
index 6adba97..7505d27 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
+package org.apache.wicket.core.request.request.cycle;
 
 import java.io.Serializable;
 import java.time.Duration;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderPageTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderPageTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderPageTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderPageTest.java
index 98d7a4c..6a6278e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/RerenderPageTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/RerenderPageTest.java
@@ -14,14 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
+package org.apache.wicket.core.request.request.cycle;
 
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import org.apache.wicket.core.request.mapper.MountedMapper;
 import org.apache.wicket.protocol.http.mock.MockHttpServletResponse;
-import org.apache.wicket.request.cycle.RerenderPage.Supplier;
+import org.apache.wicket.core.request.request.cycle.RerenderPage.Supplier;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/UrlRendererTest.java
similarity index 99%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/UrlRendererTest.java
index b7df849..dfa5053 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/cycle/UrlRendererTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
+package org.apache.wicket.core.request.request.cycle;
 
 import static java.util.Arrays.asList;
 import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/mapper/CustomHomePageTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/mapper/CustomHomePageTest.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/request/mapper/CustomHomePageTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/mapper/CustomHomePageTest.java
index ecdefe4..0d332f3 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/mapper/CustomHomePageTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/mapper/CustomHomePageTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.mapper;
+package org.apache.wicket.core.request.request.mapper;
 
 import org.apache.wicket.Application;
 import org.apache.wicket.protocol.http.WebApplication;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/mapper/info/ComponentInfoTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/mapper/info/ComponentInfoTest.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/request/mapper/info/ComponentInfoTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/mapper/info/ComponentInfoTest.java
index 21df52e..240537c 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/mapper/info/ComponentInfoTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/mapper/info/ComponentInfoTest.java
@@ -14,11 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.mapper.info;
+package org.apache.wicket.core.request.request.mapper.info;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
+import org.apache.wicket.request.mapper.info.ComponentInfo;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/mapper/info/PageComponentInfoTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/mapper/info/PageComponentInfoTest.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/request/mapper/info/PageComponentInfoTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/mapper/info/PageComponentInfoTest.java
index a657b88..03ddc01 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/mapper/info/PageComponentInfoTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/mapper/info/PageComponentInfoTest.java
@@ -14,12 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.mapper.info;
+package org.apache.wicket.core.request.request.mapper.info;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
+import org.apache.wicket.request.mapper.info.PageComponentInfo;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage.html b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/BundlesPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/BundlesPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/BundlesPage.java
similarity index 91%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/BundlesPage.java
index 74d4084..f18819b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/BundlesPage.java
@@ -14,11 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
 
 /**
  * @author papegaaij
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage_ext_result.html b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/BundlesPage_ext_result.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage_ext_result.html
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/BundlesPage_ext_result.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage_result.html b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/BundlesPage_result.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage_result.html
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/BundlesPage_result.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage_result_defer.html b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/BundlesPage_result_defer.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage_result_defer.html
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/BundlesPage_result_defer.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/ByteArrayResourceTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ByteArrayResourceTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/ByteArrayResourceTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ByteArrayResourceTest.java
index 6c163fe..35b77b8 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/ByteArrayResourceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ByteArrayResourceTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.eq;
@@ -26,6 +26,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.request.resource.ByteArrayResource;
 import org.apache.wicket.request.resource.IResource.Attributes;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/CharSequenceResourceTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/CharSequenceResourceTest.java
similarity index 77%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/CharSequenceResourceTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/CharSequenceResourceTest.java
index 340597d..371ab90 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/CharSequenceResourceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/CharSequenceResourceTest.java
@@ -14,13 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 
+import org.apache.wicket.request.resource.CharSequenceResource;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -28,17 +29,30 @@ import org.junit.jupiter.api.Test;
  */
 class CharSequenceResourceTest
 {
+	class CSR extends CharSequenceResource
+	{
+		public CSR(String contentType) {
+			super(contentType);
+		}
+
+		// make it public for the test
+		@Override
+		public Long getLength(CharSequence data) {
+			return super.getLength(data);
+		}
+	}
+
 	@Test
 	void getLength_whenNoUnicodeSymbols_thenReturnTheStringLength() throws Exception
 	{
-		CharSequenceResource resource = new CharSequenceResource("plain/text");
+		CSR resource = new CSR("plain/text");
 		assertEquals(Long.valueOf(4L), resource.getLength("abcd"));
 	}
 
 	@Test
 	void getLength_UTF8_whenUnicodeSymbols_thenReturnTheBytesLength() throws Exception
 	{
-		CharSequenceResource resource = new CharSequenceResource("plain/text");
+		CSR resource = new CSR("plain/text");
 		resource.setCharset(StandardCharsets.UTF_8);
 		assertEquals(Long.valueOf(5L), resource.getLength("a\u1234d"));
 	}
@@ -46,7 +60,7 @@ class CharSequenceResourceTest
 	@Test
 	void getLength_UTF16_whenUnicodeSymbols_thenReturnTheBytesLength() throws Exception
 	{
-		CharSequenceResource resource = new CharSequenceResource("plain/text");
+		CSR resource = new CSR("plain/text");
 		resource.setCharset(StandardCharsets.UTF_16);
 		assertEquals(Long.valueOf(8L), resource.getLength("a\u1234d"));
 	}
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/ContextRelativeResourceReferenceTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ContextRelativeResourceReferenceTest.java
similarity index 93%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/ContextRelativeResourceReferenceTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ContextRelativeResourceReferenceTest.java
index 2153310..94ef7dc 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/ContextRelativeResourceReferenceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ContextRelativeResourceReferenceTest.java
@@ -14,11 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.resource.ContextRelativeResource;
+import org.apache.wicket.request.resource.ContextRelativeResourceReference;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.apache.wicket.util.tester.WicketTester;
 import org.junit.jupiter.api.Test;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/CssPackageResourceTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/CssPackageResourceTest.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/CssPackageResourceTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/CssPackageResourceTest.java
index 7820e4c..19f673e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/CssPackageResourceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/CssPackageResourceTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -24,6 +24,7 @@ import org.apache.wicket.css.ICssCompressor;
 import org.apache.wicket.markup.html.PackageResourceTest;
 import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.resource.CssPackageResource;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/DynamicImageResourceTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/DynamicImageResourceTest.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/DynamicImageResourceTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/DynamicImageResourceTest.java
index ccee98f..f0c03cc 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/DynamicImageResourceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/DynamicImageResourceTest.java
@@ -14,13 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.wicket.request.resource.DynamicImageResource;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/JavaScriptPackageResourceTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/JavaScriptPackageResourceTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/JavaScriptPackageResourceTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/JavaScriptPackageResourceTest.java
index 14a63cb..69623e6 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/JavaScriptPackageResourceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/JavaScriptPackageResourceTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -25,6 +25,7 @@ import org.apache.wicket.javascript.IJavaScriptCompressor;
 import org.apache.wicket.markup.html.PackageResourceTest;
 import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.resource.JavaScriptPackageResource;
 import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/LessResourceReference.less b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/LessResourceReference.less
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/LessResourceReference.less
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/LessResourceReference.less
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/LessResourceReferenceTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/LessResourceReferenceTest.java
similarity index 93%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/LessResourceReferenceTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/LessResourceReferenceTest.java
index 7e4b6d5..dcabdc0 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/LessResourceReferenceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/LessResourceReferenceTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -29,6 +29,11 @@ import org.apache.wicket.markup.html.SecurePackageResourceGuard;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.resource.CssPackageResource;
+import org.apache.wicket.request.resource.CssResourceReference;
+import org.apache.wicket.request.resource.PackageResource;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.request.resource.ResourceReferenceRegistry;
 import org.apache.wicket.util.file.Files;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.StringResourceStream;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/MetaInfStaticResourceReferenceTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/MetaInfStaticResourceReferenceTest.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/MetaInfStaticResourceReferenceTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/MetaInfStaticResourceReferenceTest.java
index 135e42f..46fba4b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/MetaInfStaticResourceReferenceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/MetaInfStaticResourceReferenceTest.java
@@ -1,119 +1,121 @@
-/*
- * 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.request.resource;
-
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-import java.lang.reflect.Field;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.apache.wicket.mock.MockApplication;
-import org.apache.wicket.mock.MockWebRequest;
-import org.apache.wicket.protocol.http.mock.MockServletContext;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.util.tester.BaseWicketTester;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-/**
- * Tests for {@link MetaInfStaticResourceReference}.
- * 
- * @author akiraly
- */
-class MetaInfStaticResourceReferenceTest
-{
-	private static final String STATIC_RESOURCE_NAME = "sample.js";
-
-	/**
-	 * Test with Servlet 3.0 container
-	 * 
-	 * @throws MalformedURLException
-	 *             should not happen
-	 */
-	@Test
-	void testWithServlet30() throws MalformedURLException
-	{
-		MockApplication application = new MockApplication();
-		MockServletContext servletContext = new MockServletContext(application, null);
-		BaseWicketTester tester = new BaseWicketTester(application, servletContext);
-
-		MetaInfStaticResourceReference metaRes = new MetaInfStaticResourceReference(getClass(),
-			STATIC_RESOURCE_NAME);
-		PackageResourceReference packRes = new PackageResourceReference(getClass(),
-			STATIC_RESOURCE_NAME);
-
-		Url packUrl = tester.getRequestCycle().mapUrlFor(packRes, null);
-		Url metaUrl = tester.getRequestCycle().mapUrlFor(metaRes, null);
-
-		assertNotNull(metaUrl);
-		assertNotNull(packUrl);
-		assertFalse(metaUrl.equals(packUrl), "Meta and pack resource should not map to the same url under servlet 3.0.");
-
-		String metaUrlStr = metaUrl.toString();
-		if (metaUrlStr.charAt(1) != '/')
-		{
-			metaUrlStr = "/" + metaUrlStr;
-		}
-
-		// meta resource is served by the servlet container under 3.0
-		URL metaNetUrl = servletContext.getResource(metaUrlStr);
-
-		assertNotNull(metaNetUrl, "Meta resource is not found by the 3.0 servlet container.");
-
-		MockWebRequest request = new MockWebRequest(packUrl);
-
-		IRequestHandler requestHandler = tester.getApplication()
-			.getRootRequestMapper()
-			.mapRequest(request);
-
-		// the pack resource is still served by wicket
-		assertNotNull(requestHandler);
-	}
-
-	/**
-	 * Needs to clear META_INF_RESOURCES_SUPPORTED field in {@link MetaInfStaticResourceReference}
-	 * class between tests because classes do not get reloaded between junit tests. This is not a
-	 * problem in production where the servlet container is not changing versions.
-	 * 
-	 * @throws Exception
-	 *             if the reflection magic failed
-	 */
-	@BeforeEach
-	void before() throws Exception
-	{
-		Field field = MetaInfStaticResourceReference.class.getDeclaredField("META_INF_RESOURCES_SUPPORTED");
-		field.setAccessible(true);
-		field.set(null, null);
-	}
-
-	/**
-	 * {@link #before()}
-	 * 
-	 * @throws Exception
-	 *             if before fails
-	 */
-	@AfterEach
-	void after() throws Exception
-	{
-		before();
-	}
-
-}
\ No newline at end of file
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.request.resource;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import java.lang.reflect.Field;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.apache.wicket.mock.MockApplication;
+import org.apache.wicket.mock.MockWebRequest;
+import org.apache.wicket.protocol.http.mock.MockServletContext;
+import org.apache.wicket.request.IRequestHandler;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.resource.MetaInfStaticResourceReference;
+import org.apache.wicket.request.resource.PackageResourceReference;
+import org.apache.wicket.util.tester.BaseWicketTester;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests for {@link MetaInfStaticResourceReference}.
+ * 
+ * @author akiraly
+ */
+class MetaInfStaticResourceReferenceTest
+{
+	private static final String STATIC_RESOURCE_NAME = "sample.js";
+
+	/**
+	 * Test with Servlet 3.0 container
+	 * 
+	 * @throws MalformedURLException
+	 *             should not happen
+	 */
+	@Test
+	void testWithServlet30() throws MalformedURLException
+	{
+		MockApplication application = new MockApplication();
+		MockServletContext servletContext = new MockServletContext(application, null);
+		BaseWicketTester tester = new BaseWicketTester(application, servletContext);
+
+		MetaInfStaticResourceReference metaRes = new MetaInfStaticResourceReference(getClass(),
+			STATIC_RESOURCE_NAME);
+		PackageResourceReference packRes = new PackageResourceReference(getClass(),
+			STATIC_RESOURCE_NAME);
+
+		Url packUrl = tester.getRequestCycle().mapUrlFor(packRes, null);
+		Url metaUrl = tester.getRequestCycle().mapUrlFor(metaRes, null);
+
+		assertNotNull(metaUrl);
+		assertNotNull(packUrl);
+		assertFalse(metaUrl.equals(packUrl), "Meta and pack resource should not map to the same url under servlet 3.0.");
+
+		String metaUrlStr = metaUrl.toString();
+		if (metaUrlStr.charAt(1) != '/')
+		{
+			metaUrlStr = "/" + metaUrlStr;
+		}
+
+		// meta resource is served by the servlet container under 3.0
+		URL metaNetUrl = servletContext.getResource(metaUrlStr);
+
+		assertNotNull(metaNetUrl, "Meta resource is not found by the 3.0 servlet container.");
+
+		MockWebRequest request = new MockWebRequest(packUrl);
+
+		IRequestHandler requestHandler = tester.getApplication()
+			.getRootRequestMapper()
+			.mapRequest(request);
+
+		// the pack resource is still served by wicket
+		assertNotNull(requestHandler);
+	}
+
+	/**
+	 * Needs to clear META_INF_RESOURCES_SUPPORTED field in {@link MetaInfStaticResourceReference}
+	 * class between tests because classes do not get reloaded between junit tests. This is not a
+	 * problem in production where the servlet container is not changing versions.
+	 * 
+	 * @throws Exception
+	 *             if the reflection magic failed
+	 */
+	@BeforeEach
+	void before() throws Exception
+	{
+		Field field = MetaInfStaticResourceReference.class.getDeclaredField("META_INF_RESOURCES_SUPPORTED");
+		field.setAccessible(true);
+		field.set(null, null);
+	}
+
+	/**
+	 * {@link #before()}
+	 * 
+	 * @throws Exception
+	 *             if before fails
+	 */
+	@AfterEach
+	void after() throws Exception
+	{
+		before();
+	}
+
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/MinifiedAwareResourceReferenceTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/MinifiedAwareResourceReferenceTest.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/MinifiedAwareResourceReferenceTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/MinifiedAwareResourceReferenceTest.java
index 7bec622..dd03071 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/MinifiedAwareResourceReferenceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/MinifiedAwareResourceReferenceTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -23,6 +23,8 @@ import java.util.Locale;
 import org.apache.wicket.Application;
 import org.apache.wicket.core.util.resource.locator.ResourceStreamLocator;
 import org.apache.wicket.request.resource.IResource.Attributes;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.response.ByteArrayResponse;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.tester.WicketTestCase;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/PackageResourceReferenceTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/PackageResourceReferenceTest.java
similarity index 93%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/PackageResourceReferenceTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/PackageResourceReferenceTest.java
index 426ee24..01107d4 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/PackageResourceReferenceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/PackageResourceReferenceTest.java
@@ -1,381 +1,402 @@
-/*
- * 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.request.resource;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Locale;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.ThreadContext;
-import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
-import org.apache.wicket.protocol.http.mock.MockHttpServletResponse;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Response;
-import org.apache.wicket.request.resource.AbstractResource.ContentRangeType;
-import org.apache.wicket.request.resource.IResource.Attributes;
-import org.apache.wicket.request.resource.ResourceReference.UrlAttributes;
-import org.apache.wicket.response.ByteArrayResponse;
-import org.apache.wicket.util.io.IOUtils;
-import org.apache.wicket.util.tester.WicketTestCase;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-/**
- * @author Pedro Santos
- */
-class PackageResourceReferenceTest extends WicketTestCase
-{
-	private static Class<PackageResourceReferenceTest> scope = PackageResourceReferenceTest.class;
-	private static Locale[] locales = { null, new Locale("en"), new Locale("en", "US") };
-	private static String[] styles = { null, "style" };
-	private static String[] variations = { null, "var" };
-
-	/**
-	 * @throws Exception
-	 */
-	@BeforeEach
-	void before() throws Exception
-	{
-		// some locale outside those in locales array
-		tester.getSession().setLocale(Locale.CHINA);
-	}
-
-	/**
-	 * 
-	 */
-	@Test
-	void resourceResolution()
-	{
-		for (Locale locale : locales)
-		{
-			for (String style : styles)
-			{
-				for (String variation : variations)
-				{
-					ResourceReference reference = new PackageResourceReference(scope,
-						"resource.txt", locale, style, variation);
-					UrlAttributes urlAttributes = reference.getUrlAttributes();
-					assertEquals(locale, urlAttributes.getLocale());
-					assertEquals(style, urlAttributes.getStyle());
-					assertEquals(variation, urlAttributes.getVariation());
-
-					ByteArrayResponse byteResponse = new ByteArrayResponse();
-					Attributes mockAttributes = new Attributes(tester.getRequestCycle()
-						.getRequest(), byteResponse);
-					reference.getResource().respond(mockAttributes);
-					String fileContent = new String(byteResponse.getBytes());
-					if (locale != null)
-					{
-						assertTrue(fileContent.contains(locale.getLanguage()));
-						if (locale.getCountry() != null)
-						{
-							assertTrue(fileContent.contains(locale.getCountry()));
-						}
-					}
-					if (style != null)
-					{
-						assertTrue(fileContent.contains(style));
-					}
-					if (variation != null)
-					{
-						assertTrue(fileContent.contains(variation));
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	@Test
-	void resourceResponse()
-	{
-		for (Locale locale : locales)
-		{
-			for (String style : styles)
-			{
-				for (String variation : variations)
-				{
-					ResourceReference reference = new PackageResourceReference(scope,
-						"resource.txt", locale, style, variation);
-
-					ByteArrayResponse byteResponse = new ByteArrayResponse();
-					Attributes mockAttributes = new Attributes(tester.getRequestCycle()
-						.getRequest(), byteResponse);
-					reference.getResource().respond(mockAttributes);
-					String fileContent = new String(byteResponse.getBytes());
-					if (locale != null)
-					{
-						assertTrue(fileContent.contains(locale.getLanguage()));
-						if (locale.getCountry() != null)
-						{
-							assertTrue(fileContent.contains(locale.getCountry()));
-						}
-					}
-					if (style != null)
-					{
-						assertTrue(fileContent.contains(style));
-					}
-					if (variation != null)
-					{
-						assertTrue(fileContent.contains(variation));
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Asserting if user did not set any locale or style, those from session get used if any
-	 */
-	@Test
-	void sessionAttributesRelevance()
-	{
-		for (Locale locale : new Locale[] { new Locale("en"), new Locale("en", "US") })
-		{
-			tester.getSession().setLocale(locale);
-			for (String style : styles)
-			{
-				tester.getSession().setStyle(style);
-				for (String variation : variations)
-				{
-					ResourceReference reference = new PackageResourceReference(scope,
-						"resource.txt", null, null, variation);
-					UrlAttributes urlAttributes = reference.getUrlAttributes();
-					assertEquals(tester.getSession().getLocale(), urlAttributes.getLocale());
-					assertEquals(tester.getSession().getStyle(), urlAttributes.getStyle());
-					assertEquals(variation, urlAttributes.getVariation());
-				}
-			}
-		}
-	}
-
-	/**
-	 * Assert preference for specified locale and style over session ones
-	 */
-	@Test
-	void userAttributesPreference()
-	{
-		tester.getSession().setLocale(new Locale("en"));
-		tester.getSession().setStyle("style");
-
-		Locale[] userLocales = { null, new Locale("pt"), new Locale("pt", "BR") };
-		String userStyle = "style2";
-
-		for (Locale userLocale : userLocales)
-		{
-			for (String variation : variations)
-			{
-				ResourceReference reference = new PackageResourceReference(scope, "resource.txt",
-					userLocale, userStyle, variation);
-				UrlAttributes urlAttributes = reference.getUrlAttributes();
-
-				assertEquals(userLocale, urlAttributes.getLocale());
-				assertEquals(userStyle, urlAttributes.getStyle());
-				assertEquals(variation, urlAttributes.getVariation());
-			}
-		}
-	}
-
-	/**
-	 * see WICKET-5251 : Proper detection of already minified resources
-	 */
-	@Test
-	void testMinifiedNameDetectMinInName()
-	{
-		final PackageResourceReference html5minjs = new PackageResourceReference("html5.min.js");
-		assertEquals("html5.min.js", html5minjs.getMinifiedName());
-
-		final PackageResourceReference html5notminjs = new PackageResourceReference("html5.notmin.js");
-		assertEquals("html5.notmin.min.js", html5notminjs.getMinifiedName());
-
-		final PackageResourceReference html5notmin = new PackageResourceReference("html5notmin");
-		assertEquals("html5notmin.min", html5notmin.getMinifiedName());
-
-		final PackageResourceReference html5min = new PackageResourceReference("html5.min");
-		assertEquals("html5.min", html5min.getMinifiedName());
-
-	}
-
-	/**
-	 * see WICKET-5250 - for JavaScriptResourceReference
-	 */
-	@Test
-	void testJavaScriptResourceReferenceRespectsMinifiedResourcesDetection()
-	{
-		Application.get().getResourceSettings().setUseMinifiedResources(true);
-		final JavaScriptResourceReference notMinified = new JavaScriptResourceReference(PackageResourceReferenceTest.class, "a.js");
-		final JavaScriptPackageResource notMinifiedResource = notMinified.getResource();
-		assertTrue(notMinifiedResource.getCompress(), "Not minified resource should got its compress flag set to true");
-
-		final JavaScriptResourceReference alreadyMinified = new JavaScriptResourceReference(PackageResourceReferenceTest.class, "b.min.js");
-		final JavaScriptPackageResource alreadyMinifiedResource = alreadyMinified.getResource();
-		assertFalse(alreadyMinifiedResource.getCompress(), "Already minified resource should got its compress flag set to false");
-	}
-
-	/**
-	 * see WICKET-5250 - for CSSResourceReference
-	 */
-	@Test
-	void testCSSResourceReferenceRespectsMinifiedResourcesDetection()
-	{
-		Application.get().getResourceSettings().setUseMinifiedResources(true);
-		final CssResourceReference notMinified = new CssResourceReference(PackageResourceReferenceTest.class, "a.css");
-		final CssPackageResource notMinifiedResource = notMinified.getResource();
-		assertTrue(notMinifiedResource.getCompress(), "Not minified resource should got its compress flag set to true");
-
-		final CssResourceReference alreadyMinified = new CssResourceReference(PackageResourceReferenceTest.class, "b.min.css");
-		final CssPackageResource alreadyMinifiedResource = alreadyMinified.getResource();
-		assertFalse(alreadyMinifiedResource.getCompress(), "Already minified resource should got its compress flag set to false");
-	}
-
-	/**
-	 * See WICKET-5819 - Media tags
-	 */
-	@Test
-	void testContentRange()
-	{
-		// Test range
-		assertEquals("resource", makeRangeRequest("bytes=0-7"));
-		assertEquals("ource", makeRangeRequest("bytes=3-7"));
-		assertEquals("resource_var_style_en.txt", makeRangeRequest("bytes=0-"));
-		assertEquals("var_style_en.txt", makeRangeRequest("bytes=9-"));
-		assertEquals("resource_var_style_en.txt", makeRangeRequest("bytes=-"));
-		assertEquals("resource_var_style_en.txt", makeRangeRequest("bytes=-25"));
-	}
-
-	private String makeRangeRequest(String range)
-	{
-		ResourceReference reference = new PackageResourceReference(scope, "resource.txt",
-			locales[1], styles[1], variations[1]);
-
-		ByteArrayResponse byteResponse = new ByteArrayResponse();
-
-		Request request = tester.getRequestCycle().getRequest();
-		MockHttpServletRequest mockHttpServletRequest = (MockHttpServletRequest)request.getContainerRequest();
-		mockHttpServletRequest.setHeader("range", range);
-		Attributes mockAttributes = new Attributes(request, byteResponse);
-		reference.getResource().respond(mockAttributes);
-		return new String(byteResponse.getBytes());
-	}
-
-	/**
-	 * See WICKET-5819 - Media tags
-	 *
-	 * @throws IOException
-	 */
-	@Test
-	void testContentRangeLarge() throws IOException
-	{
-		InputStream resourceAsStream = null;
-		try
-		{
-			resourceAsStream = PackageResourceReference.class.getResourceAsStream("resource_gt_4096.txt");
-			String content = new String(IOUtils.toByteArray(resourceAsStream));
-
-			// Check buffer comprehensive range request
-			String bytes4094_4105 = makeRangeRequestToBigResource("bytes=4094-4105");
-			assertEquals(12, bytes4094_4105.length());
-			assertEquals("River Roller", bytes4094_4105);
-
-			// Check buffer exceeding range request
-			String bytes1000_4999 = makeRangeRequestToBigResource("bytes=1000-4999");
-			assertEquals(4000, bytes1000_4999.length());
-			assertEquals(content.substring(1000, 5000), bytes1000_4999);
-
-			// Check buffer exceeding range request until end of content
-			String bytes1000_end = makeRangeRequestToBigResource("bytes=1000-");
-			assertEquals(4529, bytes1000_end.length());
-			assertEquals(content.substring(1000, content.length()), bytes1000_end);
-
-			// Check complete range request
-			assertEquals(content.length(), makeRangeRequestToBigResource("bytes=-").length());
-		}
-		finally
-		{
-			IOUtils.closeQuietly(resourceAsStream);
-		}
-	}
-
-	private String makeRangeRequestToBigResource(String range)
-	{
-		ResourceReference reference = new PackageResourceReference(scope, "resource_gt_4096.txt",
-			null, null, null);
-
-		ByteArrayResponse byteResponse = new ByteArrayResponse();
-
-		Request request = tester.getRequestCycle().getRequest();
-		MockHttpServletRequest mockHttpServletRequest = (MockHttpServletRequest)request.getContainerRequest();
-		mockHttpServletRequest.setHeader("range", range);
-		Attributes mockAttributes = new Attributes(request, byteResponse);
-		reference.getResource().respond(mockAttributes);
-		return new String(byteResponse.getBytes());
-	}
-
-	/**
-	 * See WICKET-5819 - Media tags
-	 */
-	@Test
-	void testContentRangeHeaders()
-	{
-		// Test header fields
-		ResourceReference reference = new PackageResourceReference(scope, "resource.txt",
-			locales[1], styles[1], variations[1]);
-		Request request = tester.getRequestCycle().getRequest();
-		Response response = tester.getRequestCycle().getResponse();
-		MockHttpServletResponse mockHttpServletResponse = (MockHttpServletResponse)response.getContainerResponse();
-		Attributes mockAttributes = new Attributes(request, response);
-		reference.getResource().respond(mockAttributes);
-		assertEquals(ContentRangeType.BYTES.getTypeName(),
-			mockHttpServletResponse.getHeader("Accept-Range"));
-		// For normal: If a resource supports content range no content is delivered
-		// if no "Range" header is given, but we have to deliver it, because
-		// other resources then media should get the content. (e.g. CSS, JS, etc.) Browsers
-		// detecting media requests and automatically add the "Range" header for
-		// partial content and they don't make an initial request to detect if a media
-		// resource supports Content-Range (by the Accept-Range header)
-		assertEquals("resource_var_style_en.txt",
-			new String(mockHttpServletResponse.getBinaryContent()));
-	}
-
-	/**
-	 * https://issues.apache.org/jira/browse/WICKET-6031
-	 */
-	@Test
-	void noRequestCycle()
-	{
-		ThreadContext.setRequestCycle(null);
-
-		PackageResourceReference reference = new PackageResourceReference(scope, "resource.txt",
-				locales[1], styles[1], variations[1]);
-
-		PackageResource resource = reference.getResource();
-		assertNotNull(resource);
-
-		assertEquals(locales[1], resource.getResourceStream().getLocale());
-		assertEquals(styles[1], resource.getResourceStream().getStyle());
-		assertEquals(variations[1], resource.getResourceStream().getVariation());
-	}
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.request.resource;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Locale;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.ThreadContext;
+import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
+import org.apache.wicket.protocol.http.mock.MockHttpServletResponse;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.Response;
+import org.apache.wicket.request.resource.AbstractResource.ContentRangeType;
+import org.apache.wicket.request.resource.CssPackageResource;
+import org.apache.wicket.request.resource.CssResourceReference;
+import org.apache.wicket.request.resource.IResource.Attributes;
+import org.apache.wicket.request.resource.JavaScriptPackageResource;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.request.resource.PackageResource;
+import org.apache.wicket.request.resource.PackageResourceReference;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.request.resource.ResourceReference.UrlAttributes;
+import org.apache.wicket.response.ByteArrayResponse;
+import org.apache.wicket.util.io.IOUtils;
+import org.apache.wicket.util.tester.WicketTestCase;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author Pedro Santos
+ */
+class PackageResourceReferenceTest extends WicketTestCase
+{
+	private static Class<PackageResourceReferenceTest> scope = PackageResourceReferenceTest.class;
+	private static Locale[] locales = { null, new Locale("en"), new Locale("en", "US") };
+	private static String[] styles = { null, "style" };
+	private static String[] variations = { null, "var" };
+
+	/**
+	 * @throws Exception
+	 */
+	@BeforeEach
+	void before() throws Exception
+	{
+		// some locale outside those in locales array
+		tester.getSession().setLocale(Locale.CHINA);
+	}
+
+	/**
+	 * 
+	 */
+	@Test
+	void resourceResolution()
+	{
+		for (Locale locale : locales)
+		{
+			for (String style : styles)
+			{
+				for (String variation : variations)
+				{
+					ResourceReference reference = new PackageResourceReference(scope,
+						"resource.txt", locale, style, variation);
+					UrlAttributes urlAttributes = reference.getUrlAttributes();
+					assertEquals(locale, urlAttributes.getLocale());
+					assertEquals(style, urlAttributes.getStyle());
+					assertEquals(variation, urlAttributes.getVariation());
+
+					ByteArrayResponse byteResponse = new ByteArrayResponse();
+					Attributes mockAttributes = new Attributes(tester.getRequestCycle()
+						.getRequest(), byteResponse);
+					reference.getResource().respond(mockAttributes);
+					String fileContent = new String(byteResponse.getBytes());
+					if (locale != null)
+					{
+						assertTrue(fileContent.contains(locale.getLanguage()));
+						if (locale.getCountry() != null)
+						{
+							assertTrue(fileContent.contains(locale.getCountry()));
+						}
+					}
+					if (style != null)
+					{
+						assertTrue(fileContent.contains(style));
+					}
+					if (variation != null)
+					{
+						assertTrue(fileContent.contains(variation));
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * 
+	 */
+	@Test
+	void resourceResponse()
+	{
+		for (Locale locale : locales)
+		{
+			for (String style : styles)
+			{
+				for (String variation : variations)
+				{
+					ResourceReference reference = new PackageResourceReference(scope,
+						"resource.txt", locale, style, variation);
+
+					ByteArrayResponse byteResponse = new ByteArrayResponse();
+					Attributes mockAttributes = new Attributes(tester.getRequestCycle()
+						.getRequest(), byteResponse);
+					reference.getResource().respond(mockAttributes);
+					String fileContent = new String(byteResponse.getBytes());
+					if (locale != null)
+					{
+						assertTrue(fileContent.contains(locale.getLanguage()));
+						if (locale.getCountry() != null)
+						{
+							assertTrue(fileContent.contains(locale.getCountry()));
+						}
+					}
+					if (style != null)
+					{
+						assertTrue(fileContent.contains(style));
+					}
+					if (variation != null)
+					{
+						assertTrue(fileContent.contains(variation));
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Asserting if user did not set any locale or style, those from session get used if any
+	 */
+	@Test
+	void sessionAttributesRelevance()
+	{
+		for (Locale locale : new Locale[] { new Locale("en"), new Locale("en", "US") })
+		{
+			tester.getSession().setLocale(locale);
+			for (String style : styles)
+			{
+				tester.getSession().setStyle(style);
+				for (String variation : variations)
+				{
+					ResourceReference reference = new PackageResourceReference(scope,
+						"resource.txt", null, null, variation);
+					UrlAttributes urlAttributes = reference.getUrlAttributes();
+					assertEquals(tester.getSession().getLocale(), urlAttributes.getLocale());
+					assertEquals(tester.getSession().getStyle(), urlAttributes.getStyle());
+					assertEquals(variation, urlAttributes.getVariation());
+				}
+			}
+		}
+	}
+
+	/**
+	 * Assert preference for specified locale and style over session ones
+	 */
+	@Test
+	void userAttributesPreference()
+	{
+		tester.getSession().setLocale(new Locale("en"));
+		tester.getSession().setStyle("style");
+
+		Locale[] userLocales = { null, new Locale("pt"), new Locale("pt", "BR") };
+		String userStyle = "style2";
+
+		for (Locale userLocale : userLocales)
+		{
+			for (String variation : variations)
+			{
+				ResourceReference reference = new PackageResourceReference(scope, "resource.txt",
+					userLocale, userStyle, variation);
+				UrlAttributes urlAttributes = reference.getUrlAttributes();
+
+				assertEquals(userLocale, urlAttributes.getLocale());
+				assertEquals(userStyle, urlAttributes.getStyle());
+				assertEquals(variation, urlAttributes.getVariation());
+			}
+		}
+	}
+
+	/**
+	 * see WICKET-5251 : Proper detection of already minified resources
+	 */
+	@Test
+	void testMinifiedNameDetectMinInName()
+	{
+		class PRR extends PackageResourceReference
+		{
+
+			public PRR(String key) {
+				super(key);
+			}
+
+			// make it public for the test
+			@Override
+			public String getMinifiedName() {
+				return super.getMinifiedName();
+			}
+		}
+
+		final PRR html5minjs = new PRR("html5.min.js");
+		assertEquals("html5.min.js", html5minjs.getMinifiedName());
+
+		final PRR html5notminjs = new PRR("html5.notmin.js");
+		assertEquals("html5.notmin.min.js", html5notminjs.getMinifiedName());
+
+		final PRR html5notmin = new PRR("html5notmin");
+		assertEquals("html5notmin.min", html5notmin.getMinifiedName());
+
+		final PRR html5min = new PRR("html5.min");
+		assertEquals("html5.min", html5min.getMinifiedName());
+
+	}
+
+	/**
+	 * see WICKET-5250 - for JavaScriptResourceReference
+	 */
+	@Test
+	void testJavaScriptResourceReferenceRespectsMinifiedResourcesDetection()
+	{
+		Application.get().getResourceSettings().setUseMinifiedResources(true);
+		final JavaScriptResourceReference notMinified = new JavaScriptResourceReference(PackageResourceReferenceTest.class, "a.js");
+		final JavaScriptPackageResource notMinifiedResource = notMinified.getResource();
+		assertTrue(notMinifiedResource.getCompress(), "Not minified resource should got its compress flag set to true");
+
+		final JavaScriptResourceReference alreadyMinified = new JavaScriptResourceReference(PackageResourceReferenceTest.class, "b.min.js");
+		final JavaScriptPackageResource alreadyMinifiedResource = alreadyMinified.getResource();
+		assertFalse(alreadyMinifiedResource.getCompress(), "Already minified resource should got its compress flag set to false");
+	}
+
+	/**
+	 * see WICKET-5250 - for CSSResourceReference
+	 */
+	@Test
+	void testCSSResourceReferenceRespectsMinifiedResourcesDetection()
+	{
+		Application.get().getResourceSettings().setUseMinifiedResources(true);
+		final CssResourceReference notMinified = new CssResourceReference(PackageResourceReferenceTest.class, "a.css");
+		final CssPackageResource notMinifiedResource = notMinified.getResource();
+		assertTrue(notMinifiedResource.getCompress(), "Not minified resource should got its compress flag set to true");
+
+		final CssResourceReference alreadyMinified = new CssResourceReference(PackageResourceReferenceTest.class, "b.min.css");
+		final CssPackageResource alreadyMinifiedResource = alreadyMinified.getResource();
+		assertFalse(alreadyMinifiedResource.getCompress(), "Already minified resource should got its compress flag set to false");
+	}
+
+	/**
+	 * See WICKET-5819 - Media tags
+	 */
+	@Test
+	void testContentRange()
+	{
+		// Test range
+		assertEquals("resource", makeRangeRequest("bytes=0-7"));
+		assertEquals("ource", makeRangeRequest("bytes=3-7"));
+		assertEquals("resource_var_style_en.txt", makeRangeRequest("bytes=0-"));
+		assertEquals("var_style_en.txt", makeRangeRequest("bytes=9-"));
+		assertEquals("resource_var_style_en.txt", makeRangeRequest("bytes=-"));
+		assertEquals("resource_var_style_en.txt", makeRangeRequest("bytes=-25"));
+	}
+
+	private String makeRangeRequest(String range)
+	{
+		ResourceReference reference = new PackageResourceReference(scope, "resource.txt",
+			locales[1], styles[1], variations[1]);
+
+		ByteArrayResponse byteResponse = new ByteArrayResponse();
+
+		Request request = tester.getRequestCycle().getRequest();
+		MockHttpServletRequest mockHttpServletRequest = (MockHttpServletRequest)request.getContainerRequest();
+		mockHttpServletRequest.setHeader("range", range);
+		Attributes mockAttributes = new Attributes(request, byteResponse);
+		reference.getResource().respond(mockAttributes);
+		return new String(byteResponse.getBytes());
+	}
+
+	/**
+	 * See WICKET-5819 - Media tags
+	 *
+	 * @throws IOException
+	 */
+	@Test
+	void testContentRangeLarge() throws IOException
+	{
+		InputStream resourceAsStream = null;
+		try
+		{
+			resourceAsStream = PackageResourceReference.class.getResourceAsStream("resource_gt_4096.txt");
+			String content = new String(IOUtils.toByteArray(resourceAsStream));
+
+			// Check buffer comprehensive range request
+			String bytes4094_4105 = makeRangeRequestToBigResource("bytes=4094-4105");
+			assertEquals(12, bytes4094_4105.length());
+			assertEquals("River Roller", bytes4094_4105);
+
+			// Check buffer exceeding range request
+			String bytes1000_4999 = makeRangeRequestToBigResource("bytes=1000-4999");
+			assertEquals(4000, bytes1000_4999.length());
+			assertEquals(content.substring(1000, 5000), bytes1000_4999);
+
+			// Check buffer exceeding range request until end of content
+			String bytes1000_end = makeRangeRequestToBigResource("bytes=1000-");
+			assertEquals(4529, bytes1000_end.length());
+			assertEquals(content.substring(1000, content.length()), bytes1000_end);
+
+			// Check complete range request
+			assertEquals(content.length(), makeRangeRequestToBigResource("bytes=-").length());
+		}
+		finally
+		{
+			IOUtils.closeQuietly(resourceAsStream);
+		}
+	}
+
+	private String makeRangeRequestToBigResource(String range)
+	{
+		ResourceReference reference = new PackageResourceReference(scope, "resource_gt_4096.txt",
+			null, null, null);
+
+		ByteArrayResponse byteResponse = new ByteArrayResponse();
+
+		Request request = tester.getRequestCycle().getRequest();
+		MockHttpServletRequest mockHttpServletRequest = (MockHttpServletRequest)request.getContainerRequest();
+		mockHttpServletRequest.setHeader("range", range);
+		Attributes mockAttributes = new Attributes(request, byteResponse);
+		reference.getResource().respond(mockAttributes);
+		return new String(byteResponse.getBytes());
+	}
+
+	/**
+	 * See WICKET-5819 - Media tags
+	 */
+	@Test
+	void testContentRangeHeaders()
+	{
+		// Test header fields
+		ResourceReference reference = new PackageResourceReference(scope, "resource.txt",
+			locales[1], styles[1], variations[1]);
+		Request request = tester.getRequestCycle().getRequest();
+		Response response = tester.getRequestCycle().getResponse();
+		MockHttpServletResponse mockHttpServletResponse = (MockHttpServletResponse)response.getContainerResponse();
+		Attributes mockAttributes = new Attributes(request, response);
+		reference.getResource().respond(mockAttributes);
+		assertEquals(ContentRangeType.BYTES.getTypeName(),
+			mockHttpServletResponse.getHeader("Accept-Range"));
+		// For normal: If a resource supports content range no content is delivered
+		// if no "Range" header is given, but we have to deliver it, because
+		// other resources then media should get the content. (e.g. CSS, JS, etc.) Browsers
+		// detecting media requests and automatically add the "Range" header for
+		// partial content and they don't make an initial request to detect if a media
+		// resource supports Content-Range (by the Accept-Range header)
+		assertEquals("resource_var_style_en.txt",
+			new String(mockHttpServletResponse.getBinaryContent()));
+	}
+
+	/**
+	 * https://issues.apache.org/jira/browse/WICKET-6031
+	 */
+	@Test
+	void noRequestCycle()
+	{
+		ThreadContext.setRequestCycle(null);
+
+		PackageResourceReference reference = new PackageResourceReference(scope, "resource.txt",
+				locales[1], styles[1], variations[1]);
+
+		PackageResource resource = reference.getResource();
+		assertNotNull(resource);
+
+		assertEquals(locales[1], resource.getResourceStream().getLocale());
+		assertEquals(styles[1], resource.getResourceStream().getStyle());
+		assertEquals(variations[1], resource.getResourceStream().getVariation());
+	}
+
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResouceBundleTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResouceBundleTest.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/ResouceBundleTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResouceBundleTest.java
index 9b5b85c..8046b69 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResouceBundleTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResouceBundleTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -28,6 +28,10 @@ import java.util.Locale;
 
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.request.Url;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.request.resource.UrlResourceReference;
 import org.apache.wicket.request.resource.caching.IStaticCacheableResource;
 import org.apache.wicket.resource.bundles.ConcatBundleResource;
 import org.apache.wicket.resource.bundles.ResourceBundleReference;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLambdaTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResourceReferenceLambdaTest.java
similarity index 89%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLambdaTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResourceReferenceLambdaTest.java
index a31d65f..470275e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLambdaTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResourceReferenceLambdaTest.java
@@ -14,11 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.apache.wicket.util.tester.WicketTester;
 import org.junit.jupiter.api.Test;
@@ -33,7 +35,7 @@ class ResourceReferenceLambdaTest extends WicketTestCase
 	{
 		WicketTester wicketTester = super.newWicketTester(app);
 
-		IResource res = (attributes) -> 
+		IResource res = (attributes) ->
 			attributes.getResponse().write(output);
 		
 		ResourceReference resRef = ResourceReference.of("lambdares", () -> res);
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLocatingTest.csv b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResourceReferenceLocatingTest.csv
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLocatingTest.csv
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResourceReferenceLocatingTest.csv
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLocatingTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResourceReferenceLocatingTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLocatingTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResourceReferenceLocatingTest.java
index e36243b..0c39243 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceLocatingTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResourceReferenceLocatingTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -27,6 +27,8 @@ import java.util.List;
 import java.util.Locale;
 import java.util.stream.Stream;
 
+import org.apache.wicket.request.resource.JavaScriptResourceReference;
+import org.apache.wicket.request.resource.PackageResourceReference;
 import org.apache.wicket.util.io.Streams;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceRegistryTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResourceReferenceRegistryTest.java
similarity index 78%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceRegistryTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResourceReferenceRegistryTest.java
index ca4c0b5..cac4827 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/ResourceReferenceRegistryTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/ResourceReferenceRegistryTest.java
@@ -14,12 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import org.apache.wicket.request.resource.CssPackageResource;
+import org.apache.wicket.request.resource.IResource;
+import org.apache.wicket.request.resource.PackageResource;
+import org.apache.wicket.request.resource.PackageResourceReference;
+import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.request.resource.ResourceReferenceRegistry;
+import org.apache.wicket.request.resource.SharedResourceReference;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
@@ -35,7 +42,7 @@ class ResourceReferenceRegistryTest extends WicketTestCase
 	@Test
 	void addRemove()
 	{
-		ResourceReferenceRegistry registry = new ResourceReferenceRegistry();
+		RRR registry = new RRR();
 		assertEquals(0, registry.getSize());
 
 		ResourceReference reference = new PackageResourceReference(
@@ -55,7 +62,7 @@ class ResourceReferenceRegistryTest extends WicketTestCase
 	@Test
 	void addSharedResourceReference()
 	{
-		ResourceReferenceRegistry registry = new ResourceReferenceRegistry();
+		RRR registry = new RRR();
 		assertEquals(0, registry.getSize());
 
 		ResourceReference reference = new SharedResourceReference(
@@ -67,7 +74,7 @@ class ResourceReferenceRegistryTest extends WicketTestCase
 	@Test
 	void setNullResourceReferenceFactoryStillUsesTheDefault()
 	{
-		ResourceReferenceRegistry registry = new ResourceReferenceRegistry();
+		RRR registry = new RRR();
 		registry.setResourceReferenceFactory(null);
 		ResourceReference.Key key = new ResourceReference.Key(ResourceReferenceRegistryTest.class.getName(),
 				"a.css", null, null, null);
@@ -79,7 +86,7 @@ class ResourceReferenceRegistryTest extends WicketTestCase
 	@Test
 	void createLessResourceReference()
 	{
-		ResourceReferenceRegistry registry = new ResourceReferenceRegistry();
+		RRR registry = new RRR();
 		registry.setResourceReferenceFactory(new LessResourceReferenceTest.LessResourceReferenceFactory());
 		ResourceReference.Key key = new ResourceReference.Key(ResourceReferenceRegistryTest.class.getName(),
 				"LessResourceReference.less", null, null, null);
@@ -87,4 +94,13 @@ class ResourceReferenceRegistryTest extends WicketTestCase
 		assertThat(reference, instanceOf(LessResourceReferenceTest.LessResourceReference.class));
 		assertThat(reference.getResource(), instanceOf(LessResourceReferenceTest.LessPackageResource.class));
 	}
+
+	class RRR extends ResourceReferenceRegistry
+	{
+		// make it public for the test
+		@Override
+		public ResourceReference createDefaultResourceReference(ResourceReference.Key key) {
+			return super.createDefaultResourceReference(key);
+		}
+	}
 }
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/UrlResourceReferenceTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/UrlResourceReferenceTest.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/UrlResourceReferenceTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/UrlResourceReferenceTest.java
index 81b6554..37d56cc 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/UrlResourceReferenceTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/UrlResourceReferenceTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
+package org.apache.wicket.core.request.request.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -26,6 +26,7 @@ import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.request.Url;
+import org.apache.wicket.request.resource.UrlResourceReference;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.StringResourceStream;
 import org.apache.wicket.util.tester.WicketTestCase;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/WriteCallbackTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/WriteCallbackTest.java
similarity index 81%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/WriteCallbackTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/WriteCallbackTest.java
index 1dba5f6..34abe17 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/WriteCallbackTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/WriteCallbackTest.java
@@ -1,65 +1,69 @@
-/*
- * 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.request.resource;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-
-import org.apache.wicket.mock.MockWebRequest;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.resource.AbstractResource.WriteCallback;
-import org.apache.wicket.request.resource.IResource.Attributes;
-import org.apache.wicket.response.ByteArrayResponse;
-import org.junit.jupiter.api.Test;
-
-/**
- * @author Kent Tong
- */
-class WriteCallbackTest
-{
-
-	/**
-	 */
-	@Test
-	void writeStream() throws IOException
-	{
-		WriteCallback callback = new WriteCallback()
-		{
-
-			@Override
-			public void writeData(Attributes attributes)
-			{
-
-			}
-		};
-		ByteArrayResponse response = new ByteArrayResponse();
-		Attributes attributes = new Attributes(new MockWebRequest(new Url()), response);
-		byte[] srcData = new byte[5000];
-		for (int i = 0; i < srcData.length; i++)
-		{
-			srcData[i] = (byte)i;
-		}
-		InputStream in = new ByteArrayInputStream(srcData);
-		callback.writeStream(attributes, in);
-		assertTrue(Arrays.equals(response.getBytes(), srcData), "Content not equal");
-	}
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.request.request.resource;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.wicket.mock.MockWebRequest;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.resource.AbstractResource.WriteCallback;
+import org.apache.wicket.request.resource.IResource.Attributes;
+import org.apache.wicket.response.ByteArrayResponse;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author Kent Tong
+ */
+class WriteCallbackTest
+{
+
+	/**
+	 */
+	@Test
+	void writeStream() throws IOException
+	{
+		class WC extends WriteCallback
+		{
+			@Override
+			public void writeData(Attributes attributes)
+			{
+
+			}
+
+			@Override
+			public void writeStream(Attributes attributes, InputStream is) throws IOException {
+				super.writeStream(attributes, is);
+			}
+		}
+		WC callback = new WC();
+		ByteArrayResponse response = new ByteArrayResponse();
+		Attributes attributes = new Attributes(new MockWebRequest(new Url()), response);
+		byte[] srcData = new byte[5000];
+		for (int i = 0; i < srcData.length; i++)
+		{
+			srcData[i] = (byte)i;
+		}
+		InputStream in = new ByteArrayInputStream(srcData);
+		callback.writeStream(attributes, in);
+		assertArrayEquals(response.getBytes(), srcData, "Content not equal");
+	}
+
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/a.css b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/a.css
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/a.css
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/a.css
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/a.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/a.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/a.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/a.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b.css b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b.css
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b.css
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b.css
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b.min.css b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b.min.css
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b.min.css
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b.min.css
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b.min.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b.min.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b.min.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b.min.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_de.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_de.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_de.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_de.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_nl.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_nl.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_nl.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_nl.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_nl.min.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_nl.min.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_nl.min.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_nl.min.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_nl_BE.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_nl_BE.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_nl_BE.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_nl_BE.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_nl_BE.min.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_nl_BE.min.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_nl_BE.min.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_nl_BE.min.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_style.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_style.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_style.min.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style.min.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_style.min.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style.min.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_style_nl.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style_nl.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_style_nl.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style_nl.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_style_nl.min.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style_nl.min.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_style_nl.min.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style_nl.min.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_style_nl_BE.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style_nl_BE.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_style_nl_BE.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style_nl_BE.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_style_nl_BE.min.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style_nl_BE.min.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_style_nl_BE.min.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_style_nl_BE.min.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style.min.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style.min.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style.min.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style.min.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style_nl.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style_nl.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style_nl.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style_nl.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style_nl.min.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style_nl.min.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style_nl.min.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style_nl.min.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style_nl_BE.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style_nl_BE.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style_nl_BE.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style_nl_BE.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style_nl_BE.min.js b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style_nl_BE.min.js
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/b_var_style_nl_BE.min.js
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/b_var_style_nl_BE.min.js
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/caching/ContextRelativeResourceCachingTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/ContextRelativeResourceCachingTest.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/caching/ContextRelativeResourceCachingTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/ContextRelativeResourceCachingTest.java
index 8e9544e..7f135c9 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/caching/ContextRelativeResourceCachingTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/ContextRelativeResourceCachingTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource.caching;
+package org.apache.wicket.core.request.request.resource.caching;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -31,6 +31,8 @@ import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandle
 import org.apache.wicket.request.resource.ContextRelativeResource;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.request.resource.SharedResourceReference;
+import org.apache.wicket.request.resource.caching.FilenameWithVersionResourceCachingStrategy;
+import org.apache.wicket.request.resource.caching.IResourceCachingStrategy;
 import org.apache.wicket.request.resource.caching.version.IResourceVersion;
 import org.apache.wicket.request.resource.caching.version.StaticResourceVersion;
 import org.apache.wicket.util.tester.WicketTestCase;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/caching/FilenameWithVersionResourceCachingStrategyTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/FilenameWithVersionResourceCachingStrategyTest.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/caching/FilenameWithVersionResourceCachingStrategyTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/FilenameWithVersionResourceCachingStrategyTest.java
index 21f807f..66de8e0 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/caching/FilenameWithVersionResourceCachingStrategyTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/FilenameWithVersionResourceCachingStrategyTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource.caching;
+package org.apache.wicket.core.request.request.resource.caching;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import java.time.Duration;
@@ -24,6 +24,9 @@ import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.http.WebResponse;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.AbstractResource;
+import org.apache.wicket.request.resource.caching.FilenameWithVersionResourceCachingStrategy;
+import org.apache.wicket.request.resource.caching.IResourceCachingStrategy;
+import org.apache.wicket.request.resource.caching.ResourceUrl;
 import org.apache.wicket.request.resource.caching.version.IResourceVersion;
 import org.apache.wicket.request.resource.caching.version.MessageDigestResourceVersion;
 import org.apache.wicket.util.tester.BaseWicketTester;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/caching/QueryStringWithVersionResourceCachingStrategyTest.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/QueryStringWithVersionResourceCachingStrategyTest.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/caching/QueryStringWithVersionResourceCachingStrategyTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/QueryStringWithVersionResourceCachingStrategyTest.java
index c0268d0..aa94b77 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/caching/QueryStringWithVersionResourceCachingStrategyTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/QueryStringWithVersionResourceCachingStrategyTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource.caching;
+package org.apache.wicket.core.request.request.resource.caching;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -26,6 +26,9 @@ import org.apache.wicket.request.http.WebResponse;
 import org.apache.wicket.request.mapper.parameter.INamedParameters;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.resource.AbstractResource;
+import org.apache.wicket.request.resource.caching.IResourceCachingStrategy;
+import org.apache.wicket.request.resource.caching.QueryStringWithVersionResourceCachingStrategy;
+import org.apache.wicket.request.resource.caching.ResourceUrl;
 import org.apache.wicket.request.resource.caching.version.IResourceVersion;
 import org.apache.wicket.request.resource.caching.version.MessageDigestResourceVersion;
 import org.apache.wicket.util.tester.BaseWicketTester;
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/caching/TestResource.java b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/TestResource.java
similarity index 86%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/caching/TestResource.java
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/TestResource.java
index e21b6aa..b199223 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/caching/TestResource.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/caching/TestResource.java
@@ -14,10 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource.caching;
+package org.apache.wicket.core.request.request.resource.caching;
 
 import java.io.Serializable;
 
+import org.apache.wicket.request.resource.caching.IResourceCachingStrategy;
+import org.apache.wicket.request.resource.caching.IStaticCacheableResource;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.StringResourceStream;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_en.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_en.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_en.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_en.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_en_US.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_en_US.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_en_US.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_en_US.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_gt_4096.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_gt_4096.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_gt_4096.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_gt_4096.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style2.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style2.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style2.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style2.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style2_pt.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style2_pt.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style2_pt.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style2_pt.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style2_pt_BR.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style2_pt_BR.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style2_pt_BR.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style2_pt_BR.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style_en.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style_en.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style_en.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style_en.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style_en_US.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style_en_US.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_style_en_US.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_style_en_US.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_en.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_en.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_en.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_en.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_en_US.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_en_US.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_en_US.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_en_US.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style2.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style2.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style2.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style2.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style2_pt.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style2_pt.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style2_pt.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style2_pt.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style2_pt_BR.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style2_pt_BR.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style2_pt_BR.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style2_pt_BR.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style_en.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style_en.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style_en.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style_en.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style_en_US.txt b/wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style_en_US.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/request/resource/resource_var_style_en_US.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/request/request/resource/resource_var_style_en_US.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/io/PageA.java b/wicket-core/src/test/java/org/apache/wicket/core/util/io/PageA.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/io/PageA.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/io/PageA.java
index a62d385..a7a7806 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/io/PageA.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/io/PageA.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.io;
+package org.apache.wicket.core.util.io;
 
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.request.http.WebResponse;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/io/PageB.java b/wicket-core/src/test/java/org/apache/wicket/core/util/io/PageB.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/io/PageB.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/io/PageB.java
index d4170be..a19797d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/io/PageB.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/io/PageB.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.io;
+package org.apache.wicket.core.util.io;
 
 import org.apache.wicket.markup.html.WebPage;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/io/SerializableCheckerTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/io/SerializableCheckerTest.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/io/SerializableCheckerTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/io/SerializableCheckerTest.java
index 8e7d3e1..cee0e25 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/io/SerializableCheckerTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/io/SerializableCheckerTest.java
@@ -1,165 +1,166 @@
-/*
- * 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.util.io;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.io.IOException;
-import java.io.NotSerializableException;
-import java.io.Serializable;
-
-import org.apache.wicket.core.util.objects.checker.AbstractObjectChecker;
-import org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream;
-import org.apache.wicket.core.util.objects.checker.ObjectSerializationChecker;
-import org.apache.wicket.util.value.ValueMap;
-import org.junit.jupiter.api.Test;
-
-/**
- * @author Pedro Santos
- */
-class SerializableCheckerTest
-{
-
-	/**
-	 * Test {@link ValueMap} serializability.
-	 * 
-	 * @throws IOException
-	 */
-	@Test
-	void valueMap() throws IOException
-	{
-		CheckingObjectOutputStream checker = new CheckingObjectOutputStream(
-			new ByteArrayOutputStream(),
-			new ObjectSerializationChecker(new NotSerializableException()));
-		checker.writeObject(new ValueMap());
-	}
-
-	/**
-	 * Asserts that {@link org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream}
-	 * will check an instance just once, despite it occurs more than once in the object tree
-	 *
-	 * https://issues.apache.org/jira/browse/WICKET-5642
-	 *
-	 * @throws IOException
-	 */
-	@Test
-	void checkObjectsByIdentity() throws IOException
-	{
-		CountingChecker countingChecker = new CountingChecker();
-		CheckingObjectOutputStream outputStream = new CheckingObjectOutputStream(
-			new ByteArrayOutputStream(), countingChecker);
-		final IdentityTestType type = new IdentityTestType();
-		type.member = new SerializableTypeWithMember(type);
-		outputStream.writeObject(type);
-
-		assertEquals(2, countingChecker.getCount());
-	}
-
-	/**
-	 * @throws IOException
-	 */
-	@Test
-	void nonSerializableTypeDetection() throws IOException
-	{
-		CheckingObjectOutputStream checker = new CheckingObjectOutputStream(
-			new ByteArrayOutputStream(),
-			new ObjectSerializationChecker(new NotSerializableException()));
-		String exceptionMessage = null;
-		try
-		{
-			checker.writeObject(new TestType2());
-		}
-		catch (CheckingObjectOutputStream.ObjectCheckException e)
-		{
-			exceptionMessage = e.getMessage();
-		}
-		assertTrue(exceptionMessage.contains(NonSerializableType.class.getName()));
-	}
-
-	private static class CountingChecker extends AbstractObjectChecker
-	{
-		private int count = 0;
-
-		@Override
-		public Result check(Object object)
-		{
-			count++;
-			return super.check(object);
-		}
-
-		private int getCount()
-		{
-			return count;
-		}
-	}
-
-	private static class SerializableTypeWithMember extends SerializableType
-	{
-		private final IdentityTestType member;
-
-		private SerializableTypeWithMember(IdentityTestType member)
-		{
-			this.member = member;
-		}
-	}
-
-	private static class IdentityTestType implements Serializable
-	{
-		private static final long serialVersionUID = 1L;
-
-		private SerializableType member;
-
-		@Override
-		public boolean equals(Object obj)
-		{
-			return false;
-		}
-	}
-
-	private static class TestType2 implements Serializable
-	{
-		private static final long serialVersionUID = 1L;
-		ProblematicType problematicType = new ProblematicType();
-		SerializableType serializableType = new SerializableType();
-		NonSerializableType nonSerializable = new NonSerializableType();
-	}
-
-	private static class NonSerializableType
-	{
-	}
-
-	private static class SerializableType implements Serializable
-	{
-		private static final long serialVersionUID = 1L;
-	}
-	private static class TestException extends RuntimeException
-	{
-		private static final long serialVersionUID = 1L;
-
-	}
-	private static class ProblematicType implements Serializable
-	{
-		private static final long serialVersionUID = 1L;
-
-		@Override
-		public boolean equals(Object obj)
-		{
-			throw new TestException();
-		}
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.io;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.IOException;
+import java.io.NotSerializableException;
+import java.io.Serializable;
+
+import org.apache.wicket.core.util.objects.checker.AbstractObjectChecker;
+import org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream;
+import org.apache.wicket.core.util.objects.checker.ObjectSerializationChecker;
+import org.apache.wicket.util.io.ByteArrayOutputStream;
+import org.apache.wicket.util.value.ValueMap;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author Pedro Santos
+ */
+class SerializableCheckerTest
+{
+
+	/**
+	 * Test {@link ValueMap} serializability.
+	 * 
+	 * @throws IOException
+	 */
+	@Test
+	void valueMap() throws IOException
+	{
+		CheckingObjectOutputStream checker = new CheckingObjectOutputStream(
+			new ByteArrayOutputStream(),
+			new ObjectSerializationChecker(new NotSerializableException()));
+		checker.writeObject(new ValueMap());
+	}
+
+	/**
+	 * Asserts that {@link org.apache.wicket.core.util.objects.checker.CheckingObjectOutputStream}
+	 * will check an instance just once, despite it occurs more than once in the object tree
+	 *
+	 * https://issues.apache.org/jira/browse/WICKET-5642
+	 *
+	 * @throws IOException
+	 */
+	@Test
+	void checkObjectsByIdentity() throws IOException
+	{
+		CountingChecker countingChecker = new CountingChecker();
+		CheckingObjectOutputStream outputStream = new CheckingObjectOutputStream(
+			new ByteArrayOutputStream(), countingChecker);
+		final IdentityTestType type = new IdentityTestType();
+		type.member = new SerializableTypeWithMember(type);
+		outputStream.writeObject(type);
+
+		assertEquals(2, countingChecker.getCount());
+	}
+
+	/**
+	 * @throws IOException
+	 */
+	@Test
+	void nonSerializableTypeDetection() throws IOException
+	{
+		CheckingObjectOutputStream checker = new CheckingObjectOutputStream(
+			new ByteArrayOutputStream(),
+			new ObjectSerializationChecker(new NotSerializableException()));
+		String exceptionMessage = null;
+		try
+		{
+			checker.writeObject(new TestType2());
+		}
+		catch (CheckingObjectOutputStream.ObjectCheckException e)
+		{
+			exceptionMessage = e.getMessage();
+		}
+		assertTrue(exceptionMessage.contains(NonSerializableType.class.getName()));
+	}
+
+	private static class CountingChecker extends AbstractObjectChecker
+	{
+		private int count = 0;
+
+		@Override
+		public Result check(Object object)
+		{
+			count++;
+			return super.check(object);
+		}
+
+		private int getCount()
+		{
+			return count;
+		}
+	}
+
+	private static class SerializableTypeWithMember extends SerializableType
+	{
+		private final IdentityTestType member;
+
+		private SerializableTypeWithMember(IdentityTestType member)
+		{
+			this.member = member;
+		}
+	}
+
+	private static class IdentityTestType implements Serializable
+	{
+		private static final long serialVersionUID = 1L;
+
+		private SerializableType member;
+
+		@Override
+		public boolean equals(Object obj)
+		{
+			return false;
+		}
+	}
+
+	private static class TestType2 implements Serializable
+	{
+		private static final long serialVersionUID = 1L;
+		ProblematicType problematicType = new ProblematicType();
+		SerializableType serializableType = new SerializableType();
+		NonSerializableType nonSerializable = new NonSerializableType();
+	}
+
+	private static class NonSerializableType
+	{
+	}
+
+	private static class SerializableType implements Serializable
+	{
+		private static final long serialVersionUID = 1L;
+	}
+	private static class TestException extends RuntimeException
+	{
+		private static final long serialVersionUID = 1L;
+
+	}
+	private static class ProblematicType implements Serializable
+	{
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		public boolean equals(Object obj)
+		{
+			throw new TestException();
+		}
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Address.java b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Address.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/lang/Address.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/lang/Address.java
index c6da5a1..a9027d1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Address.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Address.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.lang;
+package org.apache.wicket.core.util.lang;
 
 /**
  * @author jcompagner
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/BooleanBean.java b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/BooleanBean.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/lang/BooleanBean.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/lang/BooleanBean.java
index 63e8a93..53550ba 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/BooleanBean.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/BooleanBean.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.lang;
+package org.apache.wicket.core.util.lang;
 
 /**
  * Bean for {@link PropertyResolverTest#booleanVsBoolean()}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Country.java b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Country.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/lang/Country.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/lang/Country.java
index 561af07..17133fe 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Country.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Country.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.lang;
+package org.apache.wicket.core.util.lang;
 
 /**
  * @author jcompagner
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Country2.java b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Country2.java
similarity index 93%
copy from wicket-core/src/test/java/org/apache/wicket/util/lang/Country2.java
copy to wicket-core/src/test/java/org/apache/wicket/core/util/lang/Country2.java
index 04ffbad..5dbc1d1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Country2.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Country2.java
@@ -1,47 +1,47 @@
-/*
- * 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.util.lang;
-
-/**
- * @author jcompagner
- */
-class Country2 extends Country
-{
-
-	private final Country country;
-
-	/**
-	 * Construct.
-	 * 
-	 * @param name
-	 * @param country
-	 */
-	public Country2(String name, Country country)
-	{
-		super(name);
-		this.country = country;
-	}
-
-	/**
-	 * @return Country
-	 */
-	public Country getSubCountry()
-	{
-		return country;
-	}
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.lang;
+
+/**
+ * @author jcompagner
+ */
+class Country2 extends Country
+{
+
+	private final Country country;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param name
+	 * @param country
+	 */
+	public Country2(String name, Country country)
+	{
+		super(name);
+		this.country = country;
+	}
+
+	/**
+	 * @return Country
+	 */
+	public Country getSubCountry()
+	{
+		return country;
+	}
+
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Document.java b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Document.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/lang/Document.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/lang/Document.java
index 1b59337..6cefe56 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Document.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Document.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.lang;
+package org.apache.wicket.core.util.lang;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -41,4 +41,4 @@ class Document {
 	public <T> void setProperty(String name, T t) {
 		values.put(name, t);
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person.java b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Person.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/lang/Person.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/lang/Person.java
index 3c546ce..6afa959 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Person.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.lang;
+package org.apache.wicket.core.util.lang;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Person2.java
similarity index 95%
copy from wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java
copy to wicket-core/src/test/java/org/apache/wicket/core/util/lang/Person2.java
index fcfc1c5..00966f5 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/Person2.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.lang;
+package org.apache.wicket.core.util.lang;
 
 /**
  * @author jcompagner
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/PropertyResolverTest.java
similarity index 99%
rename from wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/lang/PropertyResolverTest.java
index 6291557..c61dff1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/PropertyResolverTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.lang;
+package org.apache.wicket.core.util.lang;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -39,13 +39,11 @@ import java.util.Vector;
 import org.apache.wicket.ConverterLocator;
 import org.apache.wicket.IConverterLocator;
 import org.apache.wicket.WicketRuntimeException;
-import org.apache.wicket.core.util.lang.PropertyResolver;
 import org.apache.wicket.core.util.lang.PropertyResolver.AbstractGetAndSet;
 import org.apache.wicket.core.util.lang.PropertyResolver.CachingPropertyLocator;
 import org.apache.wicket.core.util.lang.PropertyResolver.DefaultPropertyLocator;
 import org.apache.wicket.core.util.lang.PropertyResolver.IGetAndSet;
 import org.apache.wicket.core.util.lang.PropertyResolver.IPropertyLocator;
-import org.apache.wicket.core.util.lang.PropertyResolverConverter;
 import org.apache.wicket.util.convert.ConversionException;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.convert.converter.AbstractConverter;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/WicketObjectsTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/WicketObjectsTest.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/lang/WicketObjectsTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/lang/WicketObjectsTest.java
index 00f4919..fcd5d69 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/WicketObjectsTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/lang/WicketObjectsTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.lang;
+package org.apache.wicket.core.util.lang;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotSame;
diff --git a/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ClassPathResourceFinderTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ClassPathResourceFinderTest.java
index 74044f8..4f1a710 100644
--- a/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ClassPathResourceFinderTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ClassPathResourceFinderTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.core.util.resource;
 
-import static org.apache.wicket.util.resource.ResourceStreamLocatorTest.getFilename;
+import static org.apache.wicket.core.util.resource.ResourceStreamLocatorTest.getFilename;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/PathTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/PathTest.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/PathTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/PathTest.java
index 44d8f90..7535a52 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/resource/PathTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/PathTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.resource;
+package org.apache.wicket.core.util.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -28,6 +28,8 @@ import java.nio.charset.Charset;
 import java.util.Arrays;
 
 import org.apache.wicket.util.file.Path;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest.java
index 80ae833..cb9a724 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.resource;
+package org.apache.wicket.core.util.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -31,6 +31,8 @@ import org.apache.wicket.core.util.resource.UrlResourceStream;
 import org.apache.wicket.core.util.resource.locator.IResourceStreamLocator;
 import org.apache.wicket.core.util.resource.locator.ResourceStreamLocator;
 import org.apache.wicket.util.file.IResourceFinder;
+import org.apache.wicket.util.resource.FileResourceStream;
+import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_de.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_de.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_de.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_de.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_de_DE.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_de_DE.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_de_DE.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_de_DE.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_de_DE_POSIX.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_de_DE_POSIX.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_de_DE_POSIX.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_de_DE_POSIX.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_de__POSIX.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_de__POSIX.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_de__POSIX.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_de__POSIX.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_fr.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_fr.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_fr.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_fr.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_style.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_style.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_style.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_style.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_style_de.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_style_de.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_style_de.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_style_de.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_style_de_DE.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_style_de_DE.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_style_de_DE.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_style_de_DE.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_style_de_DE_POSIX.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_style_de_DE_POSIX.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_style_de_DE_POSIX.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_style_de_DE_POSIX.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_style_de__POSIX.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_style_de__POSIX.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/sourcePath/ResourceStreamLocatorTest_style_de__POSIX.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/ResourceStreamLocatorTest_style_de__POSIX.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/UrlResourceStreamTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/UrlResourceStreamTest.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/UrlResourceStreamTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/UrlResourceStreamTest.java
index b724dd4..60829c9 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/resource/UrlResourceStreamTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/UrlResourceStreamTest.java
@@ -1,147 +1,147 @@
-/*
- * 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.util.resource;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.URLStreamHandler;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.wicket.core.util.resource.UrlResourceStream;
-import org.apache.wicket.util.lang.Bytes;
-import org.junit.jupiter.api.Test;
-
-/**
- * @author Kent Tong
- */
-class UrlResourceStreamTest {
-	/**
-	 * lastModified() shouldn't change the content length if the file isn't really changed.
-	 *
-	 * @throws IOException
-	 */
-	@Test
-	void lastModifiedForResourceInJar() throws IOException {
-		String anyClassInJarFile = "/java/lang/String.class";
-		URL url = getClass().getResource(anyClassInJarFile);
-		UrlResourceStream stream = new UrlResourceStream(url);
-		Bytes length = stream.length();
-		stream.lastModifiedTime();
-		assertEquals(stream.length(), length);
-		stream.close();
-	}
-
-	/**
-	 * Verifies that a connection is opened just once but each #getInputStream() opens a new one
-	 * and all input streams are closed with UrlResourceStream#close()
-	 *
-	 * https://issues.apache.org/jira/browse/WICKET-3176
-	 * https://issues.apache.org/jira/browse/WICKET-4293
-	 *
-	 * @throws IOException
-	 * @throws ResourceStreamNotFoundException
-	 */
-	@Test
-	void loadJustOnce() throws IOException, ResourceStreamNotFoundException {
-		String anyClassInJarFile = "/java/lang/String.class";
-		URL realURL = getClass().getResource(anyClassInJarFile);
-
-		final AtomicInteger connectCounter = new AtomicInteger(0);
-		final AtomicInteger streamCounter = new AtomicInteger(0);
-		URL url = new URL(null, "test://anything", new CountingURLStreamHandler(realURL,
-				connectCounter, streamCounter));
-
-		UrlResourceStream countingStream = new UrlResourceStream(url);
-
-		// assert the call is not made yet
-		assertEquals(0, connectCounter.get());
-		assertEquals(0, streamCounter.get());
-
-		// assert the connection is loaded lazily
-		countingStream.length();
-		assertEquals(1, connectCounter.get());
-		assertEquals(0, streamCounter.get());
-
-		// assert the following calls do not make new connections
-		countingStream.getInputStream();
-		assertEquals(1, connectCounter.get());
-		assertEquals(1, streamCounter.get());
-		countingStream.getContentType();
-		assertEquals(1, connectCounter.get());
-		assertEquals(1, streamCounter.get());
-		countingStream.getInputStream();
-		assertEquals(1, connectCounter.get());
-		assertEquals(2, streamCounter.get());
-		countingStream.close();
-
-		assertEquals(1, connectCounter.get());
-		assertEquals(2, streamCounter.get());
-
-		// assert the connection is re-opened (again lazily) second time,
-		// but stream is not re-opened yet
-		countingStream.length();
-
-		assertEquals(2, connectCounter.get());
-		assertEquals(2, streamCounter.get());
-
-		// assert stream is re-opened on next getInputStream call
-		countingStream.getInputStream();
-		assertEquals(2, connectCounter.get());
-		assertEquals(3, streamCounter.get());
-	}
-
-
-	/**
-	 * {@link URLStreamHandler} that counts the calls to {@link URL#openConnection()}
-	 */
-	private static final class CountingURLStreamHandler extends URLStreamHandler {
-		private final AtomicInteger connectCounter, streamCounter;
-
-		private final URL realURL;
-
-		CountingURLStreamHandler(URL realURL, AtomicInteger connectCounter,
-								 AtomicInteger streamCounter) {
-			this.connectCounter = connectCounter;
-			this.streamCounter = streamCounter;
-			this.realURL = realURL;
-		}
-
-		@Override
-		protected URLConnection openConnection(URL u) throws IOException {
-			connectCounter.getAndIncrement();
-
-			final URLConnection realConn = realURL.openConnection();
-			return new URLConnection(u) {
-
-				@Override
-				public void connect() throws IOException {
-					realConn.connect();
-				}
-
-				@Override
-				public InputStream getInputStream() throws IOException {
-					streamCounter.incrementAndGet();
-					return realConn.getInputStream();
-				}
-			};
-		}
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.resource;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.wicket.util.lang.Bytes;
+import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author Kent Tong
+ */
+class UrlResourceStreamTest {
+	/**
+	 * lastModified() shouldn't change the content length if the file isn't really changed.
+	 *
+	 * @throws IOException
+	 */
+	@Test
+	void lastModifiedForResourceInJar() throws IOException {
+		String anyClassInJarFile = "/java/lang/String.class";
+		URL url = getClass().getResource(anyClassInJarFile);
+		UrlResourceStream stream = new UrlResourceStream(url);
+		Bytes length = stream.length();
+		stream.lastModifiedTime();
+		assertEquals(stream.length(), length);
+		stream.close();
+	}
+
+	/**
+	 * Verifies that a connection is opened just once but each #getInputStream() opens a new one
+	 * and all input streams are closed with UrlResourceStream#close()
+	 *
+	 * https://issues.apache.org/jira/browse/WICKET-3176
+	 * https://issues.apache.org/jira/browse/WICKET-4293
+	 *
+	 * @throws IOException
+	 * @throws ResourceStreamNotFoundException
+	 */
+	@Test
+	void loadJustOnce() throws IOException, ResourceStreamNotFoundException {
+		String anyClassInJarFile = "/java/lang/String.class";
+		URL realURL = getClass().getResource(anyClassInJarFile);
+
+		final AtomicInteger connectCounter = new AtomicInteger(0);
+		final AtomicInteger streamCounter = new AtomicInteger(0);
+		URL url = new URL(null, "test://anything", new CountingURLStreamHandler(realURL,
+				connectCounter, streamCounter));
+
+		UrlResourceStream countingStream = new UrlResourceStream(url);
+
+		// assert the call is not made yet
+		assertEquals(0, connectCounter.get());
+		assertEquals(0, streamCounter.get());
+
+		// assert the connection is loaded lazily
+		countingStream.length();
+		assertEquals(1, connectCounter.get());
+		assertEquals(0, streamCounter.get());
+
+		// assert the following calls do not make new connections
+		countingStream.getInputStream();
+		assertEquals(1, connectCounter.get());
+		assertEquals(1, streamCounter.get());
+		countingStream.getContentType();
+		assertEquals(1, connectCounter.get());
+		assertEquals(1, streamCounter.get());
+		countingStream.getInputStream();
+		assertEquals(1, connectCounter.get());
+		assertEquals(2, streamCounter.get());
+		countingStream.close();
+
+		assertEquals(1, connectCounter.get());
+		assertEquals(2, streamCounter.get());
+
+		// assert the connection is re-opened (again lazily) second time,
+		// but stream is not re-opened yet
+		countingStream.length();
+
+		assertEquals(2, connectCounter.get());
+		assertEquals(2, streamCounter.get());
+
+		// assert stream is re-opened on next getInputStream call
+		countingStream.getInputStream();
+		assertEquals(2, connectCounter.get());
+		assertEquals(3, streamCounter.get());
+	}
+
+
+	/**
+	 * {@link URLStreamHandler} that counts the calls to {@link URL#openConnection()}
+	 */
+	private static final class CountingURLStreamHandler extends URLStreamHandler {
+		private final AtomicInteger connectCounter, streamCounter;
+
+		private final URL realURL;
+
+		CountingURLStreamHandler(URL realURL, AtomicInteger connectCounter,
+								 AtomicInteger streamCounter) {
+			this.connectCounter = connectCounter;
+			this.streamCounter = streamCounter;
+			this.realURL = realURL;
+		}
+
+		@Override
+		protected URLConnection openConnection(URL u) throws IOException {
+			connectCounter.getAndIncrement();
+
+			final URLConnection realConn = realURL.openConnection();
+			return new URLConnection(u) {
+
+				@Override
+				public void connect() throws IOException {
+					realConn.connect();
+				}
+
+				@Override
+				public InputStream getInputStream() throws IOException {
+					streamCounter.incrementAndGet();
+					return realConn.getInputStream();
+				}
+			};
+		}
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/locator/CachingResourceStreamLocatorTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/locator/CachingResourceStreamLocatorTest.java
index 825d92a..fd15e29 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/CachingResourceStreamLocatorTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/locator/CachingResourceStreamLocatorTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.resource.locator;
+package org.apache.wicket.core.util.resource.locator;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -30,8 +30,6 @@ import java.util.Locale;
 import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
 import org.apache.wicket.core.util.resource.ClassPathResourceFinder;
 import org.apache.wicket.core.util.resource.UrlResourceStream;
-import org.apache.wicket.core.util.resource.locator.IResourceStreamLocator;
-import org.apache.wicket.core.util.resource.locator.ResourceStreamLocator;
 import org.apache.wicket.core.util.resource.locator.caching.CachingResourceStreamLocator;
 import org.apache.wicket.util.resource.FileResourceStream;
 import org.apache.wicket.util.resource.IResourceStream;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/ResourceNameIteratorTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/locator/ResourceNameIteratorTest.java
similarity index 90%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/locator/ResourceNameIteratorTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/locator/ResourceNameIteratorTest.java
index 0212315..487c19a 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/resource/locator/ResourceNameIteratorTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/locator/ResourceNameIteratorTest.java
@@ -1,183 +1,179 @@
-/*
- * 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.util.resource.locator;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Locale;
-
-import org.apache.wicket.core.util.resource.locator.ExtensionResourceNameIterator;
-import org.apache.wicket.core.util.resource.locator.LocaleResourceNameIterator;
-import org.apache.wicket.core.util.resource.locator.ResourceNameIterator;
-import org.apache.wicket.core.util.resource.locator.StyleAndVariationResourceNameIterator;
-import org.apache.wicket.util.tester.WicketTestCase;
-import org.junit.jupiter.api.Test;
-
-/**
- * @author Pedro Santos
- */
-class ResourceNameIteratorTest extends WicketTestCase
-{
-	/**
-	 * Asserting no duplicated locale sufix get iterated
-	 */
-	@Test
-	void localeResourceNameIterator()
-	{
-		Locale locale = new Locale("a", "b", "c");
-		LocaleResourceNameIterator iterator = new LocaleResourceNameIterator(locale, false);
-		HashSet<String> variations = new HashSet<String>();
-		while (iterator.hasNext())
-		{
-			assertTrue(variations.add(iterator.next()));
-		}
-		assertEquals(4, variations.size());
-		assertTrue(variations.contains("_a_B_c"));
-		assertTrue(variations.contains("_a_B"));
-		assertTrue(variations.contains("_a"));
-		assertTrue(variations.contains(""));
-
-		locale = new Locale("a", "b");
-		iterator = new LocaleResourceNameIterator(locale, false);
-		variations = new HashSet<String>();
-		while (iterator.hasNext())
-		{
-			assertTrue(variations.add(iterator.next()));
-		}
-		assertEquals(3, variations.size());
-		assertTrue(variations.contains("_a_B"));
-		assertTrue(variations.contains("_a"));
-		assertTrue(variations.contains(""));
-
-		locale = new Locale("a");
-		iterator = new LocaleResourceNameIterator(locale, false);
-		variations = new HashSet<String>();
-		while (iterator.hasNext())
-		{
-			assertTrue(variations.add(iterator.next()));
-		}
-		assertEquals(2, variations.size());
-		assertTrue(variations.contains("_a"));
-		assertTrue(variations.contains(""));
-	}
-
-	/**
-	 * 
-	 */
-	@Test
-	void styleAndVariationResourceNameIterator()
-	{
-		StyleAndVariationResourceNameIterator iterator = new StyleAndVariationResourceNameIterator(
-			null, null);
-		assertTrue(iterator.hasNext());
-		iterator.next();
-		assertFalse(iterator.hasNext());
-
-		iterator = new StyleAndVariationResourceNameIterator("style", null);
-		assertTrue(iterator.hasNext());
-		iterator.next();
-		assertEquals("style", iterator.getStyle());
-		assertEquals(null, iterator.getVariation());
-		iterator.next();
-		assertEquals(null, iterator.getStyle());
-		assertEquals(null, iterator.getVariation());
-		assertFalse(iterator.hasNext());
-
-		iterator = new StyleAndVariationResourceNameIterator("style", "variation");
-		assertTrue(iterator.hasNext());
-		iterator.next();
-		assertEquals("style", iterator.getStyle());
-		assertEquals("variation", iterator.getVariation());
-		iterator.next();
-		assertEquals("style", iterator.getStyle());
-		assertEquals(null, iterator.getVariation());
-		iterator.next();
-		assertEquals(null, iterator.getStyle());
-		assertEquals("variation", iterator.getVariation());
-		iterator.next();
-		assertEquals(null, iterator.getStyle());
-		assertEquals(null, iterator.getVariation());
-		assertFalse(iterator.hasNext());
-	}
-
-	/**
-	 * 
-	 */
-	@Test
-	void extensionResourceNameIterator()
-	{
-		ExtensionResourceNameIterator iterator = new ExtensionResourceNameIterator(null);
-		assertTrue(iterator.hasNext());
-		assertEquals(null, iterator.next());
-		assertFalse(iterator.hasNext());
-
-		iterator = new ExtensionResourceNameIterator(Arrays.asList("txt"));
-		assertTrue(iterator.hasNext());
-		assertEquals("txt", iterator.next());
-		assertFalse(iterator.hasNext());
-
-		iterator = new ExtensionResourceNameIterator(Arrays.asList("properties", "utf8.properties", "properties.xml"));
-		assertTrue(iterator.hasNext());
-		assertEquals("properties", iterator.next());
-		assertTrue(iterator.hasNext());
-		assertEquals("utf8.properties", iterator.next());
-		assertTrue(iterator.hasNext());
-		assertEquals("properties.xml", iterator.next());
-		assertFalse(iterator.hasNext());
-	}
-
-	/**
-	 * 
-	 */
-	@Test
-	void noDuplicateVariations()
-	{
-		String path = "patch.extension";
-		String style = null;
-		String var = "var";
-		Locale locale = Locale.CANADA_FRENCH;
-		Iterable<String> extensions = null;
-		boolean strict = false;
-		Iterator<String> iterator = new ResourceNameIterator(path, style, var, locale, extensions, strict);
-		HashSet<String> variations = new HashSet<String>();
-		while (iterator.hasNext())
-		{
-			assertTrue(variations.add(iterator.next()));
-		}
-		assertEquals(6, variations.size());
-	}
-
-	/**
-	 * 
-	 */
-	@Test
-	void noTrailingDotWhenNoExtension()
-	{
-		Iterator<String> iterator = new ResourceNameIterator("foo", null, null, null, null, false);
-
-		assertTrue(iterator.hasNext());
-
-		assertEquals("foo", iterator.next());
-
-		assertFalse(iterator.hasNext());
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.resource.locator;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Locale;
+
+import org.apache.wicket.util.tester.WicketTestCase;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author Pedro Santos
+ */
+class ResourceNameIteratorTest extends WicketTestCase
+{
+	/**
+	 * Asserting no duplicated locale sufix get iterated
+	 */
+	@Test
+	void localeResourceNameIterator()
+	{
+		Locale locale = new Locale("a", "b", "c");
+		LocaleResourceNameIterator iterator = new LocaleResourceNameIterator(locale, false);
+		HashSet<String> variations = new HashSet<String>();
+		while (iterator.hasNext())
+		{
+			assertTrue(variations.add(iterator.next()));
+		}
+		assertEquals(4, variations.size());
+		assertTrue(variations.contains("_a_B_c"));
+		assertTrue(variations.contains("_a_B"));
+		assertTrue(variations.contains("_a"));
+		assertTrue(variations.contains(""));
+
+		locale = new Locale("a", "b");
+		iterator = new LocaleResourceNameIterator(locale, false);
+		variations = new HashSet<String>();
+		while (iterator.hasNext())
+		{
+			assertTrue(variations.add(iterator.next()));
+		}
+		assertEquals(3, variations.size());
+		assertTrue(variations.contains("_a_B"));
+		assertTrue(variations.contains("_a"));
+		assertTrue(variations.contains(""));
+
+		locale = new Locale("a");
+		iterator = new LocaleResourceNameIterator(locale, false);
+		variations = new HashSet<String>();
+		while (iterator.hasNext())
+		{
+			assertTrue(variations.add(iterator.next()));
+		}
+		assertEquals(2, variations.size());
+		assertTrue(variations.contains("_a"));
+		assertTrue(variations.contains(""));
+	}
+
+	/**
+	 * 
+	 */
+	@Test
+	void styleAndVariationResourceNameIterator()
+	{
+		StyleAndVariationResourceNameIterator iterator = new StyleAndVariationResourceNameIterator(
+			null, null);
+		assertTrue(iterator.hasNext());
+		iterator.next();
+		assertFalse(iterator.hasNext());
+
+		iterator = new StyleAndVariationResourceNameIterator("style", null);
+		assertTrue(iterator.hasNext());
+		iterator.next();
+		assertEquals("style", iterator.getStyle());
+		assertEquals(null, iterator.getVariation());
+		iterator.next();
+		assertEquals(null, iterator.getStyle());
+		assertEquals(null, iterator.getVariation());
+		assertFalse(iterator.hasNext());
+
+		iterator = new StyleAndVariationResourceNameIterator("style", "variation");
+		assertTrue(iterator.hasNext());
+		iterator.next();
+		assertEquals("style", iterator.getStyle());
+		assertEquals("variation", iterator.getVariation());
+		iterator.next();
+		assertEquals("style", iterator.getStyle());
+		assertEquals(null, iterator.getVariation());
+		iterator.next();
+		assertEquals(null, iterator.getStyle());
+		assertEquals("variation", iterator.getVariation());
+		iterator.next();
+		assertEquals(null, iterator.getStyle());
+		assertEquals(null, iterator.getVariation());
+		assertFalse(iterator.hasNext());
+	}
+
+	/**
+	 * 
+	 */
+	@Test
+	void extensionResourceNameIterator()
+	{
+		ExtensionResourceNameIterator iterator = new ExtensionResourceNameIterator(null);
+		assertTrue(iterator.hasNext());
+		assertEquals(null, iterator.next());
+		assertFalse(iterator.hasNext());
+
+		iterator = new ExtensionResourceNameIterator(Arrays.asList("txt"));
+		assertTrue(iterator.hasNext());
+		assertEquals("txt", iterator.next());
+		assertFalse(iterator.hasNext());
+
+		iterator = new ExtensionResourceNameIterator(Arrays.asList("properties", "utf8.properties", "properties.xml"));
+		assertTrue(iterator.hasNext());
+		assertEquals("properties", iterator.next());
+		assertTrue(iterator.hasNext());
+		assertEquals("utf8.properties", iterator.next());
+		assertTrue(iterator.hasNext());
+		assertEquals("properties.xml", iterator.next());
+		assertFalse(iterator.hasNext());
+	}
+
+	/**
+	 * 
+	 */
+	@Test
+	void noDuplicateVariations()
+	{
+		String path = "patch.extension";
+		String style = null;
+		String var = "var";
+		Locale locale = Locale.CANADA_FRENCH;
+		Iterable<String> extensions = null;
+		boolean strict = false;
+		Iterator<String> iterator = new ResourceNameIterator(path, style, var, locale, extensions, strict);
+		HashSet<String> variations = new HashSet<String>();
+		while (iterator.hasNext())
+		{
+			assertTrue(variations.add(iterator.next()));
+		}
+		assertEquals(6, variations.size());
+	}
+
+	/**
+	 * 
+	 */
+	@Test
+	void noTrailingDotWhenNoExtension()
+	{
+		Iterator<String> iterator = new ResourceNameIterator("foo", null, null, null, null, false);
+
+		assertTrue(iterator.hasNext());
+
+		assertEquals("foo", iterator.next());
+
+		assertFalse(iterator.hasNext());
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_de.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_de.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_de.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_de.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_de_DE.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_de_DE.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_de_DE.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_de_DE.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_de_DE_POSIX.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_de_DE_POSIX.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_de_DE_POSIX.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_de_DE_POSIX.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_de__POSIX.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_de__POSIX.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_de__POSIX.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_de__POSIX.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_style.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_style.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_style.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_style.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_style_de.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_style_de.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_style_de.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_style_de.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_style_de_DE.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_style_de_DE.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_style_de_DE.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_style_de_DE.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_style_de_DE_POSIX.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_style_de_DE_POSIX.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_style_de_DE_POSIX.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_style_de_DE_POSIX.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_style_de__POSIX.txt b/wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_style_de__POSIX.txt
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/resource/ResourceStreamLocatorTest_style_de__POSIX.txt
rename to wicket-core/src/test/java/org/apache/wicket/core/util/resource/sourcePath/ResourceStreamLocatorTest_style_de__POSIX.txt
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/string/JavaScriptStripperTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/string/JavaScriptStripperTest.java
similarity index 99%
rename from wicket-core/src/test/java/org/apache/wicket/util/string/JavaScriptStripperTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/string/JavaScriptStripperTest.java
index d928cc6..e7df546 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/string/JavaScriptStripperTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/string/JavaScriptStripperTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.string;
+package org.apache.wicket.core.util.string;
 
 import org.apache.wicket.core.util.string.JavaScriptStripper;
 import org.junit.jupiter.api.Test;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/string/interpolator/PropertyVariableInterpolatorTest.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/string/interpolator/PropertyVariableInterpolatorTest.java
index e437501..fb89079 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/string/interpolator/PropertyVariableInterpolatorTest.java
@@ -1,73 +1,73 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.util.string.interpolator;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.apache.wicket.core.util.string.interpolator.PropertyVariableInterpolator;
-import org.junit.jupiter.api.Test;
-
-/**
- * Tests {@link PropertyVariableInterpolator}
- * 
- * @author Gerolf Seitz
- */
-class PropertyVariableInterpolatorTest
-{
-	/**
-	 * 
-	 */
-	@Test
-	void withValue()
-	{
-		TestClass object = new TestClass("value");
-		String result = new PropertyVariableInterpolator("${key}", object).toString();
-		assertEquals("value", result.toString());
-	}
-
-	/**
-	 * A test that shows a usage of escape character. The first two '$' characters are squashed to
-	 * '$' and '${key}' is interpolated to the respective value
-	 */
-	@Test
-	void withValueAndEscape()
-	{
-		TestClass object = new TestClass("3.24");
-		String result = new PropertyVariableInterpolator("$$${key}", object).toString();
-		assertEquals("$3.24", result.toString());
-	}
-
-	/**
-	 * 
-	 */
-	@Test
-	void withoutValue()
-	{
-		String result = new PropertyVariableInterpolator("${key}", null).toString();
-		assertEquals("${key}", result.toString());
-	}
-
-	private static class TestClass
-	{
-		private final String key;
-
-		TestClass(String key)
-		{
-			this.key = key;
-		}
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.string.interpolator;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.apache.wicket.core.util.string.interpolator.PropertyVariableInterpolator;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests {@link PropertyVariableInterpolator}
+ * 
+ * @author Gerolf Seitz
+ */
+class PropertyVariableInterpolatorTest
+{
+	/**
+	 * 
+	 */
+	@Test
+	void withValue()
+	{
+		TestClass object = new TestClass("value");
+		String result = new PropertyVariableInterpolator("${key}", object).toString();
+		assertEquals("value", result.toString());
+	}
+
+	/**
+	 * A test that shows a usage of escape character. The first two '$' characters are squashed to
+	 * '$' and '${key}' is interpolated to the respective value
+	 */
+	@Test
+	void withValueAndEscape()
+	{
+		TestClass object = new TestClass("3.24");
+		String result = new PropertyVariableInterpolator("$$${key}", object).toString();
+		assertEquals("$3.24", result.toString());
+	}
+
+	/**
+	 * 
+	 */
+	@Test
+	void withoutValue()
+	{
+		String result = new PropertyVariableInterpolator("${key}", null).toString();
+		assertEquals("${key}", result.toString());
+	}
+
+	private static class TestClass
+	{
+		private final String key;
+
+		TestClass(String key)
+		{
+			this.key = key;
+		}
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/ExceptionTestBase.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/ExceptionTestBase.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/ExceptionTestBase.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/ExceptionTestBase.java
index 05d2203..c8081d7 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/ExceptionTestBase.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/ExceptionTestBase.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util;
+package org.apache.wicket.core.util.util;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/Log4jEventHistory.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/Log4jEventHistory.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/Log4jEventHistory.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/Log4jEventHistory.java
index 8d87ea9..77e00df 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/Log4jEventHistory.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/Log4jEventHistory.java
@@ -1,74 +1,74 @@
-/*
- * 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.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.Level;
-import org.apache.log4j.spi.LoggingEvent;
-
-/**
- * Log the log4j messages for further assertions
- * */
-class Log4jEventHistory extends AppenderSkeleton
-{
-	private List<LoggingEvent> history = new ArrayList<LoggingEvent>();
-
-	/**
-	 * @return log history
-	 */
-	public List<LoggingEvent> getHistory()
-	{
-		return history;
-	}
-
-	@Override
-	public void close()
-	{
-	}
-
-	@Override
-	public boolean requiresLayout()
-	{
-		return false;
-	}
-
-	@Override
-	protected void append(LoggingEvent event)
-	{
-		history.add(event);
-	}
-
-	/**
-	 * @param level
-	 * @param msg
-	 * @return if this message was logged
-	 */
-	public boolean contains(Level level, String msg)
-	{
-		for (LoggingEvent event : history)
-		{
-			if (msg.equals(event.getMessage()) && level.equals(event.getLevel()))
-			{
-				return true;
-			}
-		}
-		return false;
-	}
-}
\ No newline at end of file
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.AppenderSkeleton;
+import org.apache.log4j.Level;
+import org.apache.log4j.spi.LoggingEvent;
+
+/**
+ * Log the log4j messages for further assertions
+ * */
+class Log4jEventHistory extends AppenderSkeleton
+{
+	private List<LoggingEvent> history = new ArrayList<LoggingEvent>();
+
+	/**
+	 * @return log history
+	 */
+	public List<LoggingEvent> getHistory()
+	{
+		return history;
+	}
+
+	@Override
+	public void close()
+	{
+	}
+
+	@Override
+	public boolean requiresLayout()
+	{
+		return false;
+	}
+
+	@Override
+	protected void append(LoggingEvent event)
+	{
+		history.add(event);
+	}
+
+	/**
+	 * @param level
+	 * @param msg
+	 * @return if this message was logged
+	 */
+	public boolean contains(Level level, String msg)
+	{
+		for (LoggingEvent event : history)
+		{
+			if (msg.equals(event.getMessage()) && level.equals(event.getLevel()))
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/cookies/CookieUtilsTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/CookieUtilsTest.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/cookies/CookieUtilsTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/CookieUtilsTest.java
index 9dc3347..a57fac7 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/cookies/CookieUtilsTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/CookieUtilsTest.java
@@ -1,179 +1,180 @@
-/*
- * 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.util.cookies;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import javax.servlet.http.Cookie;
-
-import org.apache.wicket.Page;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.util.cookies.CookieValuePersisterTestPage.TestForm;
-import org.apache.wicket.util.tester.WicketTestCase;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-/**
- * 
- * @author Juergen Donnerstag
- */
-class CookieUtilsTest extends WicketTestCase
-{
-	@BeforeEach
-	void before()
-	{
-		tester.startPage(CookieValuePersisterTestPage.class);
-	}
-
-	/**
-	 * 
-	 * @throws Exception
-	 */
-	@SuppressWarnings({ "unchecked" })
-	@Test
-	void test1() throws Exception
-	{
-		// How does the test work: Make sure you have a page, form and form component properly set
-		// up (getRelativePath() etc.). See #before().
-		final Page page = tester.getLastRenderedPage();
-
-		// Get the form and form component created
-		final TestForm form = (TestForm)page.get("form");
-		final TextField<String> textField = (TextField<String>)form.get("input");
-
-		// Right after init, the requests and responses cookie lists must be empty
-		assertEquals(0, getRequestCookies().size());
-		assertEquals(0, getResponseCookies().size());
-
-		// Create a persister for the test
-		final CookieUtils persister = new CookieUtils();
-
-		// See comment in CookieUtils on how removing a Cookies works. As no cookies in the request,
-		// no "delete" cookie will be added to the response.
-		persister.remove(textField);
-		assertEquals(0, getRequestCookies().size());
-		assertEquals(0, getResponseCookies().size());
-
-		// Save the input field's value (add it to the response's cookie list)
-		persister.save(textField);
-		assertTrue(getRequestCookies().isEmpty());
-		assertEquals(1, getResponseCookies().size());
-		assertEquals("test", (getResponseCookies().get(0)).getValue());
-		assertEquals("form.input", (getResponseCookies().get(0)).getName());
-		assertEquals(tester.getRequest().getContextPath() + tester.getRequest().getServletPath(),
-			(getResponseCookies().get(0)).getPath());
-
-		// To remove a cookie means to add a cookie with maxAge=0. Provided a cookie with the same
-		// name has been provided in the request. Thus, no changes in our test case
-		persister.remove(textField);
-		assertEquals(0, getRequestCookies().size());
-		assertEquals(1, getResponseCookies().size());
-		assertEquals("test", (getResponseCookies().get(0)).getValue());
-		assertEquals("form.input", (getResponseCookies().get(0)).getName());
-		assertEquals(tester.getRequest().getContextPath() + tester.getRequest().getServletPath(),
-			(getResponseCookies().get(0)).getPath());
-
-		// Try to load it. Because there is no Cookie matching the textfield's name the model's
-		// value remains unchanged
-		persister.load(textField);
-		assertEquals("test", textField.getDefaultModelObjectAsString());
-
-		// Simulate loading a textfield. Initialize textfield with a new (default) value, copy the
-		// cookie from response to request (simulating a browser), than load the textfield from
-		// cookie and voala the textfield's value should change.
-		// save means: add it to the response
-		// load means: take it from request
-		assertEquals("test", textField.getDefaultModelObjectAsString());
-		textField.setDefaultModelObject("new text");
-		assertEquals("new text", textField.getDefaultModelObjectAsString());
-		copyCookieFromResponseToRequest();
-		assertEquals(1, getRequestCookies().size());
-		assertEquals(1, getResponseCookies().size());
-
-		persister.load(textField);
-		assertEquals("test", textField.getDefaultModelObjectAsString());
-		assertEquals(1, getRequestCookies().size());
-		assertEquals(1, getResponseCookies().size());
-
-		// remove all cookies from mock response. Because I'll find the cookie to be removed in the
-		// request, the persister will create a "delete" cookie to remove the cookie on the client
-		// and add it to the response. The already existing Cookie from the previous test gets
-		// removed from response since it is the same.
-		persister.remove(textField);
-		assertEquals(1, getRequestCookies().size());
-		assertEquals(1, getResponseCookies().size());
-		assertEquals("form.input", (getResponseCookies().get(0)).getName());
-		assertEquals(0, (getResponseCookies().get(0)).getMaxAge());
-	}
-
-	@Test
-	void saveLoadValue()
-	{
-		CookieUtils utils = new CookieUtils();
-		String value1 = "value one";
-		String key = "key";
-		utils.save(key, value1);
-		before(); // execute a request cycle, so the response cookie is send with the next request
-		String result = utils.load(key);
-		assertEquals(value1, result);
-	}
-
-	@Test
-	void defaults()
-	{
-		CookieDefaults defaults = new CookieDefaults();
-		defaults.setComment("A comment");
-		defaults.setDomain("A domain");
-		defaults.setMaxAge(123);
-		defaults.setSecure(true);
-		defaults.setVersion(456);
-		CookieUtils utils = new CookieUtils(defaults);
-		String value1 = "value one";
-		String key = "key";
-		utils.save(key, value1);
-		before(); // execute a request cycle, so the response cookie is send with the next request
-		Cookie result = utils.getCookie(key);
-		assertEquals(defaults.getComment(), result.getComment());
-	}
-
-	private void copyCookieFromResponseToRequest()
-	{
-		tester.getRequest().addCookie(getResponseCookies().iterator().next());
-	}
-
-	private Collection<Cookie> getRequestCookies()
-	{
-		if (tester.getRequest().getCookies() == null)
-		{
-			return Collections.emptyList();
-		}
-		else
-		{
-			return Arrays.asList(tester.getRequest().getCookies());
-		}
-	}
-
-	private List<Cookie> getResponseCookies()
-	{
-		return tester.getResponse().getCookies();
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util.cookies;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import javax.servlet.http.Cookie;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.util.cookies.CookieDefaults;
+import org.apache.wicket.util.cookies.CookieUtils;
+import org.apache.wicket.util.tester.WicketTestCase;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+/**
+ * 
+ * @author Juergen Donnerstag
+ */
+class CookieUtilsTest extends WicketTestCase
+{
+	@BeforeEach
+	void before()
+	{
+		tester.startPage(CookieValuePersisterTestPage.class);
+	}
+
+	/**
+	 * 
+	 * @throws Exception
+	 */
+	@SuppressWarnings({ "unchecked" })
+	@Test
+	void test1() throws Exception
+	{
+		// How does the test work: Make sure you have a page, form and form component properly set
+		// up (getRelativePath() etc.). See #before().
+		final Page page = tester.getLastRenderedPage();
+
+		// Get the form and form component created
+		final CookieValuePersisterTestPage.TestForm form = (CookieValuePersisterTestPage.TestForm)page.get("form");
+		final TextField<String> textField = (TextField<String>)form.get("input");
+
+		// Right after init, the requests and responses cookie lists must be empty
+		assertEquals(0, getRequestCookies().size());
+		assertEquals(0, getResponseCookies().size());
+
+		// Create a persister for the test
+		final CookieUtils persister = new CookieUtils();
+
+		// See comment in CookieUtils on how removing a Cookies works. As no cookies in the request,
+		// no "delete" cookie will be added to the response.
+		persister.remove(textField);
+		assertEquals(0, getRequestCookies().size());
+		assertEquals(0, getResponseCookies().size());
+
+		// Save the input field's value (add it to the response's cookie list)
+		persister.save(textField);
+		assertTrue(getRequestCookies().isEmpty());
+		assertEquals(1, getResponseCookies().size());
+		assertEquals("test", (getResponseCookies().get(0)).getValue());
+		assertEquals("form.input", (getResponseCookies().get(0)).getName());
+		assertEquals(tester.getRequest().getContextPath() + tester.getRequest().getServletPath(),
+			(getResponseCookies().get(0)).getPath());
+
+		// To remove a cookie means to add a cookie with maxAge=0. Provided a cookie with the same
+		// name has been provided in the request. Thus, no changes in our test case
+		persister.remove(textField);
+		assertEquals(0, getRequestCookies().size());
+		assertEquals(1, getResponseCookies().size());
+		assertEquals("test", (getResponseCookies().get(0)).getValue());
+		assertEquals("form.input", (getResponseCookies().get(0)).getName());
+		assertEquals(tester.getRequest().getContextPath() + tester.getRequest().getServletPath(),
+			(getResponseCookies().get(0)).getPath());
+
+		// Try to load it. Because there is no Cookie matching the textfield's name the model's
+		// value remains unchanged
+		persister.load(textField);
+		assertEquals("test", textField.getDefaultModelObjectAsString());
+
+		// Simulate loading a textfield. Initialize textfield with a new (default) value, copy the
+		// cookie from response to request (simulating a browser), than load the textfield from
+		// cookie and voala the textfield's value should change.
+		// save means: add it to the response
+		// load means: take it from request
+		assertEquals("test", textField.getDefaultModelObjectAsString());
+		textField.setDefaultModelObject("new text");
+		assertEquals("new text", textField.getDefaultModelObjectAsString());
+		copyCookieFromResponseToRequest();
+		assertEquals(1, getRequestCookies().size());
+		assertEquals(1, getResponseCookies().size());
+
+		persister.load(textField);
+		assertEquals("test", textField.getDefaultModelObjectAsString());
+		assertEquals(1, getRequestCookies().size());
+		assertEquals(1, getResponseCookies().size());
+
+		// remove all cookies from mock response. Because I'll find the cookie to be removed in the
+		// request, the persister will create a "delete" cookie to remove the cookie on the client
+		// and add it to the response. The already existing Cookie from the previous test gets
+		// removed from response since it is the same.
+		persister.remove(textField);
+		assertEquals(1, getRequestCookies().size());
+		assertEquals(1, getResponseCookies().size());
+		assertEquals("form.input", (getResponseCookies().get(0)).getName());
+		assertEquals(0, (getResponseCookies().get(0)).getMaxAge());
+	}
+
+	@Test
+	void saveLoadValue()
+	{
+		CookieUtils utils = new CookieUtils();
+		String value1 = "value one";
+		String key = "key";
+		utils.save(key, value1);
+		before(); // execute a request cycle, so the response cookie is send with the next request
+		String result = utils.load(key);
+		assertEquals(value1, result);
+	}
+
+	@Test
+	void defaults()
+	{
+		CookieDefaults defaults = new CookieDefaults();
+		defaults.setComment("A comment");
+		defaults.setDomain("A domain");
+		defaults.setMaxAge(123);
+		defaults.setSecure(true);
+		defaults.setVersion(456);
+		CookieUtils utils = new CookieUtils(defaults);
+		String value1 = "value one";
+		String key = "key";
+		utils.save(key, value1);
+		before(); // execute a request cycle, so the response cookie is send with the next request
+		Cookie result = utils.getCookie(key);
+		assertEquals(defaults.getComment(), result.getComment());
+	}
+
+	private void copyCookieFromResponseToRequest()
+	{
+		tester.getRequest().addCookie(getResponseCookies().iterator().next());
+	}
+
+	private Collection<Cookie> getRequestCookies()
+	{
+		if (tester.getRequest().getCookies() == null)
+		{
+			return Collections.emptyList();
+		}
+		else
+		{
+			return Arrays.asList(tester.getRequest().getCookies());
+		}
+	}
+
+	private List<Cookie> getResponseCookies()
+	{
+		return tester.getResponse().getCookies();
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/cookies/CookieValuePersisterTestPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/CookieValuePersisterTestPage.html
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/cookies/CookieValuePersisterTestPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/CookieValuePersisterTestPage.html
index 35b562d..5b2d3cf 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/cookies/CookieValuePersisterTestPage.html
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/CookieValuePersisterTestPage.html
@@ -1,26 +1,26 @@
-<!--
-    $Id: CookieValuePersisterTestPage.html 527232 2007-04-10 18:15:14Z jcompagner $
-    $Revision: 527232 $
-    $Date: 2007-04-10 20:15:14 +0200 (Di, 10 Apr 2007) $
-
-    ====================================================================
-    Licensed 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.
--->
-<html>
-<body>
-  <form wicket:id="form">
-    <input wicket:id="input" type="text" />
-  </form>
-  <span wicket:id="feedback"></span>
-</body>
-</html>
+<!--
+    $Id: CookieValuePersisterTestPage.html 527232 2007-04-10 18:15:14Z jcompagner $
+    $Revision: 527232 $
+    $Date: 2007-04-10 20:15:14 +0200 (Di, 10 Apr 2007) $
+
+    ====================================================================
+    Licensed 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.
+-->
+<html>
+<body>
+  <form wicket:id="form">
+    <input wicket:id="input" type="text" />
+  </form>
+  <span wicket:id="feedback"></span>
+</body>
+</html>
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/cookies/CookieValuePersisterTestPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/CookieValuePersisterTestPage.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/cookies/CookieValuePersisterTestPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/CookieValuePersisterTestPage.java
index 9144162..e8a46f1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/cookies/CookieValuePersisterTestPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/CookieValuePersisterTestPage.java
@@ -1,70 +1,70 @@
-/*
- * 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.util.cookies;
-
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.markup.html.panel.FeedbackPanel;
-import org.apache.wicket.model.Model;
-
-
-/**
- * Mock page for testing.
- * 
- * @author Chris Turner
- */
-public class CookieValuePersisterTestPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Construct.
-	 */
-	public CookieValuePersisterTestPage()
-	{
-		// Create and add feedback panel to page
-		final FeedbackPanel feedback = new FeedbackPanel("feedback");
-		add(feedback);
-		add(new TestForm("form"));
-	}
-
-	/**
-	 * 
-	 */
-	public final class TestForm extends Form<Void>
-	{
-		private static final long serialVersionUID = 1L;
-
-		/**
-		 * Constructor
-		 * 
-		 * @param id
-		 *            Name of form
-		 */
-        TestForm(final String id)
-		{
-			super(id);
-			add(new TextField<String>("input", new Model<String>("test")));
-		}
-
-		@Override
-		public final void onSubmit()
-		{
-		}
-	}
-}
\ No newline at end of file
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util.cookies;
+
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.markup.html.panel.FeedbackPanel;
+import org.apache.wicket.model.Model;
+
+
+/**
+ * Mock page for testing.
+ * 
+ * @author Chris Turner
+ */
+public class CookieValuePersisterTestPage extends WebPage
+{
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Construct.
+	 */
+	public CookieValuePersisterTestPage()
+	{
+		// Create and add feedback panel to page
+		final FeedbackPanel feedback = new FeedbackPanel("feedback");
+		add(feedback);
+		add(new TestForm("form"));
+	}
+
+	/**
+	 * 
+	 */
+	public final class TestForm extends Form<Void>
+	{
+		private static final long serialVersionUID = 1L;
+
+		/**
+		 * Constructor
+		 * 
+		 * @param id
+		 *            Name of form
+		 */
+        TestForm(final String id)
+		{
+			super(id);
+			add(new TextField<String>("input", new Model<String>("test")));
+		}
+
+		@Override
+		public final void onSubmit()
+		{
+		}
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/cookies/PreserveRequestCookieAfterLinkClickTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/PreserveRequestCookieAfterLinkClickTest.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/cookies/PreserveRequestCookieAfterLinkClickTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/PreserveRequestCookieAfterLinkClickTest.java
index fde9098..6144635 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/cookies/PreserveRequestCookieAfterLinkClickTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/PreserveRequestCookieAfterLinkClickTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.cookies;
+package org.apache.wicket.core.util.util.cookies;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatefullTestPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatefullTestPage.html
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatefullTestPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatefullTestPage.html
index 2406cfb..742e586 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatefullTestPage.html
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatefullTestPage.html
@@ -1,26 +1,26 @@
-<!--
-    $Id: CookieValuePersisterTestPage.html 527232 2007-04-10 18:15:14Z jcompagner $
-    $Revision: 527232 $
-    $Date: 2007-04-10 20:15:14 +0200 (Di, 10 Apr 2007) $
-
-    ====================================================================
-    Licensed 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.
--->
-<html>
-<body>
-  <form wicket:id="form">
-    <input wicket:id="input" type="text" />
-    <input type="submit" value="set cookie" />
-  </form>
-</body>
-</html>
+<!--
+    $Id: CookieValuePersisterTestPage.html 527232 2007-04-10 18:15:14Z jcompagner $
+    $Revision: 527232 $
+    $Date: 2007-04-10 20:15:14 +0200 (Di, 10 Apr 2007) $
+
+    ====================================================================
+    Licensed 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.
+-->
+<html>
+<body>
+  <form wicket:id="form">
+    <input wicket:id="input" type="text" />
+    <input type="submit" value="set cookie" />
+  </form>
+</body>
+</html>
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatefullTestPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatefullTestPage.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatefullTestPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatefullTestPage.java
index 0af469b..c5db148 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatefullTestPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatefullTestPage.java
@@ -1,61 +1,62 @@
-/*
- * 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.util.cookies;
-
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-
-
-/**
- * Stateful form page which sets a cookie and calls setResponsePage()
- * 
- * @author Bertrand Guay-Paquet
- */
-public class SetCookieAndRedirectStatefullTestPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
-
-	/**	 */
-	private static final String cookieName = "CookieValuePersisterStatelessTestPage";
-
-	private IModel<String> inputModel;
-
-	/**
-	 * Construct.
-	 */
-	public SetCookieAndRedirectStatefullTestPage()
-	{
-		inputModel = new Model<String>();
-		Form<Void> form = new Form<Void>("form")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onSubmit()
-			{
-				CookieUtils utils = new CookieUtils();
-				utils.save(cookieName, inputModel.getObject());
-				setResponsePage(getApplication().getHomePage());
-			}
-		};
-		add(form);
-		form.add(new TextField<String>("input", inputModel));
-	}
-}
\ No newline at end of file
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util.cookies;
+
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.util.cookies.CookieUtils;
+
+
+/**
+ * Stateful form page which sets a cookie and calls setResponsePage()
+ * 
+ * @author Bertrand Guay-Paquet
+ */
+public class SetCookieAndRedirectStatefullTestPage extends WebPage
+{
+	private static final long serialVersionUID = 1L;
+
+	/**	 */
+	private static final String cookieName = "CookieValuePersisterStatelessTestPage";
+
+	private IModel<String> inputModel;
+
+	/**
+	 * Construct.
+	 */
+	public SetCookieAndRedirectStatefullTestPage()
+	{
+		inputModel = new Model<String>();
+		Form<Void> form = new Form<Void>("form")
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit()
+			{
+				CookieUtils utils = new CookieUtils();
+				utils.save(cookieName, inputModel.getObject());
+				setResponsePage(getApplication().getHomePage());
+			}
+		};
+		add(form);
+		form.add(new TextField<String>("input", inputModel));
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatelessTestPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatelessTestPage.html
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatelessTestPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatelessTestPage.html
index 2406cfb..742e586 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatelessTestPage.html
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatelessTestPage.html
@@ -1,26 +1,26 @@
-<!--
-    $Id: CookieValuePersisterTestPage.html 527232 2007-04-10 18:15:14Z jcompagner $
-    $Revision: 527232 $
-    $Date: 2007-04-10 20:15:14 +0200 (Di, 10 Apr 2007) $
-
-    ====================================================================
-    Licensed 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.
--->
-<html>
-<body>
-  <form wicket:id="form">
-    <input wicket:id="input" type="text" />
-    <input type="submit" value="set cookie" />
-  </form>
-</body>
-</html>
+<!--
+    $Id: CookieValuePersisterTestPage.html 527232 2007-04-10 18:15:14Z jcompagner $
+    $Revision: 527232 $
+    $Date: 2007-04-10 20:15:14 +0200 (Di, 10 Apr 2007) $
+
+    ====================================================================
+    Licensed 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.
+-->
+<html>
+<body>
+  <form wicket:id="form">
+    <input wicket:id="input" type="text" />
+    <input type="submit" value="set cookie" />
+  </form>
+</body>
+</html>
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatelessTestPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatelessTestPage.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatelessTestPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatelessTestPage.java
index 665bd9d..345d5ba 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectStatelessTestPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectStatelessTestPage.java
@@ -1,62 +1,63 @@
-/*
- * 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.util.cookies;
-
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.StatelessForm;
-import org.apache.wicket.markup.html.form.TextField;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-
-
-/**
- * Stateless form page which sets a cookie and calls setResponsePage()
- * 
- * @author Bertrand Guay-Paquet
- */
-public class SetCookieAndRedirectStatelessTestPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
-
-	/**	 */
-	private static final String cookieName = "CookieValuePersisterStatelessTestPage";
-
-	private IModel<String> inputModel;
-
-	/**
-	 * Construct.
-	 */
-	public SetCookieAndRedirectStatelessTestPage()
-	{
-		inputModel = new Model<String>();
-		Form<Void> form = new StatelessForm<Void>("form")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onSubmit()
-			{
-				CookieUtils utils = new CookieUtils();
-				utils.save(cookieName, inputModel.getObject());
-				setResponsePage(getApplication().getHomePage());
-			}
-		};
-		add(form);
-		form.add(new TextField<String>("input", inputModel));
-	}
-}
\ No newline at end of file
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util.cookies;
+
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.StatelessForm;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.util.cookies.CookieUtils;
+
+
+/**
+ * Stateless form page which sets a cookie and calls setResponsePage()
+ * 
+ * @author Bertrand Guay-Paquet
+ */
+public class SetCookieAndRedirectStatelessTestPage extends WebPage
+{
+	private static final long serialVersionUID = 1L;
+
+	/**	 */
+	private static final String cookieName = "CookieValuePersisterStatelessTestPage";
+
+	private IModel<String> inputModel;
+
+	/**
+	 * Construct.
+	 */
+	public SetCookieAndRedirectStatelessTestPage()
+	{
+		inputModel = new Model<String>();
+		Form<Void> form = new StatelessForm<Void>("form")
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit()
+			{
+				CookieUtils utils = new CookieUtils();
+				utils.save(cookieName, inputModel.getObject());
+				setResponsePage(getApplication().getHomePage());
+			}
+		};
+		add(form);
+		form.add(new TextField<String>("input", inputModel));
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectTest.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectTest.java
index 4429c0c..b8d758e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/cookies/SetCookieAndRedirectTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/cookies/SetCookieAndRedirectTest.java
@@ -1,71 +1,71 @@
-/*
- * 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.util.cookies;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import java.util.List;
-import javax.servlet.http.Cookie;
-
-import org.apache.wicket.Page;
-import org.apache.wicket.util.tester.FormTester;
-import org.apache.wicket.util.tester.WicketTestCase;
-import org.junit.jupiter.api.Test;
-
-/**
- * Tests setting a cookie and calling setResponsePage() in the same request.
- * 
- * @author Bertrand Guay-Paquet
- */
-class SetCookieAndRedirectTest extends WicketTestCase
-{
-	private static final String cookieValue = "cookieValue";
-
-	/**
-	 * Validate proper cookie value set with stateful page
-	 */
-	@Test
-	void statefulPage()
-	{
-		tester.startPage(SetCookieAndRedirectStatefullTestPage.class);
-		FormTester formTester = tester.newFormTester("form");
-		formTester.setValue("input", cookieValue);
-		formTester.submit();
-		Page page = tester.getLastRenderedPage();
-
-		List<Cookie> cookies = tester.getLastResponse().getCookies();
-		assertEquals(1, cookies.size());
-		assertEquals(cookieValue, cookies.get(0).getValue());
-	}
-
-	/**
-	 * Validate proper cookie value set with stateless page
-	 */
-	@Test
-	void statelessPage()
-	{
-		tester.startPage(SetCookieAndRedirectStatelessTestPage.class);
-		FormTester formTester = tester.newFormTester("form");
-		formTester.setValue("input", cookieValue);
-		formTester.submit();
-		Page page = tester.getLastRenderedPage();
-
-		List<Cookie> cookies = tester.getLastResponse().getCookies();
-		assertEquals(1, cookies.size());
-		assertEquals(cookieValue, cookies.get(0).getValue());
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util.cookies;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.List;
+import javax.servlet.http.Cookie;
+
+import org.apache.wicket.Page;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.util.tester.WicketTestCase;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests setting a cookie and calling setResponsePage() in the same request.
+ * 
+ * @author Bertrand Guay-Paquet
+ */
+class SetCookieAndRedirectTest extends WicketTestCase
+{
+	private static final String cookieValue = "cookieValue";
+
+	/**
+	 * Validate proper cookie value set with stateful page
+	 */
+	@Test
+	void statefulPage()
+	{
+		tester.startPage(SetCookieAndRedirectStatefullTestPage.class);
+		FormTester formTester = tester.newFormTester("form");
+		formTester.setValue("input", cookieValue);
+		formTester.submit();
+		Page page = tester.getLastRenderedPage();
+
+		List<Cookie> cookies = tester.getLastResponse().getCookies();
+		assertEquals(1, cookies.size());
+		assertEquals(cookieValue, cookies.get(0).getValue());
+	}
+
+	/**
+	 * Validate proper cookie value set with stateless page
+	 */
+	@Test
+	void statelessPage()
+	{
+		tester.startPage(SetCookieAndRedirectStatelessTestPage.class);
+		FormTester formTester = tester.newFormTester("form");
+		formTester.setValue("input", cookieValue);
+		formTester.submit();
+		Page page = tester.getLastRenderedPage();
+
+		List<Cookie> cookies = tester.getLastResponse().getCookies();
+		assertEquals(1, cookies.size());
+		assertEquals(cookieValue, cookies.get(0).getValue());
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/file/WebApplicationPathTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/file/WebApplicationPathTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/file/WebApplicationPathTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/file/WebApplicationPathTest.java
index 81c288e..b4966e1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/file/WebApplicationPathTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/file/WebApplicationPathTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.file;
+package org.apache.wicket.core.util.util.file;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/markup/xhtml/WellFormedXmlTest.java
similarity index 89%
rename from wicket-core/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/markup/xhtml/WellFormedXmlTest.java
index 26cfc9d..08d8c3e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/markup/xhtml/WellFormedXmlTest.java
@@ -1,34 +1,35 @@
-/*
- * 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.util.markup.xhtml;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * Checks that the html markup files are well formed xml-s.
- * 
- * @author akiraly
- */
-class WellFormedXmlTest extends WellFormedXmlTestCase
-{
-	@Test
-	@Override
-	public void markupFiles()
-	{
-		super.markupFiles();
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util.markup.xhtml;
+
+import org.apache.wicket.util.markup.xhtml.WellFormedXmlTestCase;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Checks that the html markup files are well formed xml-s.
+ * 
+ * @author akiraly
+ */
+class WellFormedXmlTest extends WellFormedXmlTestCase
+{
+	@Test
+	@Override
+	public void markupFiles()
+	{
+		super.markupFiles();
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/template/CssTemplateTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/template/CssTemplateTest.java
similarity index 90%
rename from wicket-core/src/test/java/org/apache/wicket/util/template/CssTemplateTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/template/CssTemplateTest.java
index f60cc77..99f3775 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/template/CssTemplateTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/template/CssTemplateTest.java
@@ -14,10 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.template;
+package org.apache.wicket.core.util.util.template;
 
 import java.util.Map;
 
+import org.apache.wicket.util.template.CssTemplate;
+import org.apache.wicket.util.template.TextTemplate;
 import org.junit.jupiter.api.Test;
 
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/BlockedResourceLinkPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/BlockedResourceLinkPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/BlockedResourceLinkPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/BlockedResourceLinkPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/BlockedResourceLinkPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/BlockedResourceLinkPage.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/BlockedResourceLinkPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/BlockedResourceLinkPage.java
index aa12d73..8064d21 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/BlockedResourceLinkPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/BlockedResourceLinkPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.link.ResourceLink;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/CookiePage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/CookiePage.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/CookiePage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/CookiePage.java
index 241e9f6..12f6943 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/CookiePage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/CookiePage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -22,6 +22,7 @@ import javax.servlet.http.Cookie;
 
 import org.apache.wicket.request.http.WebRequest;
 import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.util.tester.DummyHomePage;
 
 /**
  * A test page for https://issues.apache.org/jira/browse/WICKET-4289
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest$TestPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/FormTesterSubmitLinkTest$TestPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest$TestPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/FormTesterSubmitLinkTest$TestPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/FormTesterSubmitLinkTest.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/FormTesterSubmitLinkTest.java
index 654fce2..28410c2 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterSubmitLinkTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/FormTesterSubmitLinkTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -33,6 +33,9 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 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.apache.wicket.util.tester.WicketTester;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/FormTesterTest.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/FormTesterTest.java
index 3f91b2c..a678123 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/FormTesterTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/FormTesterTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -42,8 +42,8 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.file.File;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.StringResourceStream;
-import org.apache.wicket.util.tester.MockFormFileUploadPage.MockDomainObjectFileUpload;
-import org.apache.wicket.util.tester.MockFormPage.MockDomainObject;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -62,7 +62,7 @@ class FormTesterTest extends WicketTestCase
 	{
 		tester.startPage(MockFormPage.class);
 		MockFormPage page = (MockFormPage)tester.getLastRenderedPage();
-		MockDomainObject domainObject = page.getDomainObject();
+		MockFormPage.MockDomainObject domainObject = page.getDomainObject();
 
 		assertNotNull(domainObject);
 		assertNull(domainObject.getText());
@@ -87,7 +87,7 @@ class FormTesterTest extends WicketTestCase
 	{
 		tester.startPage(MockFormPage.class);
 		MockFormPage page = (MockFormPage)tester.getLastRenderedPage();
-		MockDomainObject domainObject = page.getDomainObject();
+		MockFormPage.MockDomainObject domainObject = page.getDomainObject();
 		assertFalse(domainObject.isCheckbox());
 
 		FormTester formTester = tester.newFormTester("form");
@@ -112,7 +112,7 @@ class FormTesterTest extends WicketTestCase
 	{
 		tester.startPage(MockFormFileUploadPage.class);
 		MockFormFileUploadPage page = (MockFormFileUploadPage)tester.getLastRenderedPage();
-		MockDomainObjectFileUpload domainObject = page.getDomainObject();
+		MockFormFileUploadPage.MockDomainObjectFileUpload domainObject = page.getDomainObject();
 
 		assertNull(page.getFileUpload());
 		assertNotNull(domainObject);
@@ -147,7 +147,7 @@ class FormTesterTest extends WicketTestCase
 	{
 		tester.startPage(MockFormFileUploadPage.class);
 		MockFormFileUploadPage page = (MockFormFileUploadPage)tester.getLastRenderedPage();
-		MockDomainObjectFileUpload domainObject = page.getDomainObject();
+		MockFormFileUploadPage.MockDomainObjectFileUpload domainObject = page.getDomainObject();
 
 		assertNull(page.getFileUpload());
 		assertNotNull(domainObject);
@@ -206,7 +206,7 @@ class FormTesterTest extends WicketTestCase
 	{
 		tester.startPage(MockFormFileUploadPage.class, new PageParameters().set("required", false));
 		MockFormFileUploadPage page = (MockFormFileUploadPage)tester.getLastRenderedPage();
-		MockDomainObjectFileUpload domainObject = page.getDomainObject();
+		MockFormFileUploadPage.MockDomainObjectFileUpload domainObject = page.getDomainObject();
 
 		Session.get().setLocale(Locale.US);
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockAjaxFormPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockAjaxFormPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockAjaxFormPage.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockAjaxFormPage.java
index eeaf101..36c0a1c 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockAjaxFormPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockAjaxFormPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import java.io.Serializable;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormFileUploadPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormFileUploadPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormFileUploadPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormFileUploadPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormFileUploadPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormFileUploadPage.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormFileUploadPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormFileUploadPage.java
index ec5cf1e..2fab9ad 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormFileUploadPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormFileUploadPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import java.io.Serializable;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormPage.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormPage.java
index c8c4689..1048e9d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import java.io.Serializable;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormSubmitsPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormSubmitsPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormSubmitsPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormSubmitsPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormSubmitsPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormSubmitsPage.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormSubmitsPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormSubmitsPage.java
index 05b2040..dbd8597 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockFormSubmitsPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockFormSubmitsPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageAjaxSubmitLinkSubmitsWholeForm.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageAjaxSubmitLinkSubmitsWholeForm.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageAjaxSubmitLinkSubmitsWholeForm.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageAjaxSubmitLinkSubmitsWholeForm.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageAjaxSubmitLinkSubmitsWholeForm.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageAjaxSubmitLinkSubmitsWholeForm.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageAjaxSubmitLinkSubmitsWholeForm.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageAjaxSubmitLinkSubmitsWholeForm.java
index 86b487a..421dba3 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageAjaxSubmitLinkSubmitsWholeForm.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageAjaxSubmitLinkSubmitsWholeForm.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageParameterPage$MockInnerClassPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageParameterPage$MockInnerClassPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageParameterPage$MockInnerClassPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageParameterPage$MockInnerClassPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageParameterPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageParameterPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageParameterPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageParameterPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageParameterPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageParameterPage.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageParameterPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageParameterPage.java
index 3bac594..55269f4 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageParameterPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageParameterPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithFormAndAjaxFormSubmitBehavior.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithFormAndAjaxFormSubmitBehavior.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithFormAndAjaxFormSubmitBehavior.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithFormAndAjaxFormSubmitBehavior.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithFormAndAjaxFormSubmitBehavior.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithFormAndAjaxFormSubmitBehavior.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithFormAndAjaxFormSubmitBehavior.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithFormAndAjaxFormSubmitBehavior.java
index cf4f07d..9bde2eb 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithFormAndAjaxFormSubmitBehavior.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithFormAndAjaxFormSubmitBehavior.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import java.io.Serializable;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithFormAndCheckGroup.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithFormAndCheckGroup.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithFormAndCheckGroup.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithFormAndCheckGroup.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithFormAndCheckGroup.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithFormAndCheckGroup.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithFormAndCheckGroup.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithFormAndCheckGroup.java
index 156bb7b..d66ae18 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithFormAndCheckGroup.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithFormAndCheckGroup.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithLabelInEnclosure.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithLabelInEnclosure.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithLabelInEnclosure.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithLabelInEnclosure.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithLabelInEnclosure.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithLabelInEnclosure.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithLabelInEnclosure.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithLabelInEnclosure.java
index 0c1d146..2755175 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithLabelInEnclosure.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithLabelInEnclosure.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithLinkAndLabel.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithLinkAndLabel.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithLinkAndLabel.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithLinkAndLabel.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithLinkAndLabel.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithLinkAndLabel.java
similarity index 93%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithLinkAndLabel.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithLinkAndLabel.java
index b55a572..d0f6c7e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockPageWithLinkAndLabel.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockPageWithLinkAndLabel.java
@@ -1,44 +1,44 @@
-/*
- * 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.util.tester;
-
-import org.apache.wicket.markup.html.WebPage;
-
-/**
- * Mock page containing a link with a label inside
- */
-public class MockPageWithLinkAndLabel extends WebPage
-{
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Link wicket id
-	 */
-	public static final String LINK_ID = "link";
-
-	/**
-	 * Label wicket id
-	 */
-	public static final String LABEL_ID = "label";
-
-	/**
-	 * Label component path
-	 */
-	public static final String LABEL_PATH = "link:label";
-
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util.tester;
+
+import org.apache.wicket.markup.html.WebPage;
+
+/**
+ * Mock page containing a link with a label inside
+ */
+public class MockPageWithLinkAndLabel extends WebPage
+{
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Link wicket id
+	 */
+	public static final String LINK_ID = "link";
+
+	/**
+	 * Label wicket id
+	 */
+	public static final String LABEL_ID = "label";
+
+	/**
+	 * Label component path
+	 */
+	public static final String LABEL_PATH = "link:label";
+
+
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockResourceLinkPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockResourceLinkPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockResourceLinkPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockResourceLinkPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockResourceLinkPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockResourceLinkPage.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/MockResourceLinkPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockResourceLinkPage.java
index 801066c..e2a2559 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/MockResourceLinkPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/MockResourceLinkPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.link.ResourceLink;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/NestedFormPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/NestedFormPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/NestedFormPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/NestedFormPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/NestedFormPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/NestedFormPage.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/NestedFormPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/NestedFormPage.java
index 62b5037..a43da37 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/NestedFormPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/NestedFormPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.Button;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/StartComponentInPageRedirectToRenderTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/StartComponentInPageRedirectToRenderTest.java
similarity index 93%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/StartComponentInPageRedirectToRenderTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/StartComponentInPageRedirectToRenderTest.java
index 5fc8db2..a9b42e3 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/StartComponentInPageRedirectToRenderTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/StartComponentInPageRedirectToRenderTest.java
@@ -14,13 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.settings.RequestCycleSettings;
+import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/TagTesterTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/TagTesterTest.java
similarity index 99%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/TagTesterTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/TagTesterTest.java
index 1f040f1..30a9719 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/TagTesterTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/TagTesterTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.util.List;
 
+import org.apache.wicket.util.tester.TagTester;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -466,4 +467,4 @@ class TagTesterTest
         assertEquals("hr2", tags.get(1).getAttribute("id"));
         assertEquals("<hr wicket:id=\"hr\" id=\"hr2\"/>", tags.get(1).getMarkup());
     }	
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterClickExternalLinkTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterClickExternalLinkTest.java
similarity index 93%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterClickExternalLinkTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterClickExternalLinkTest.java
index 5789165..805d51a 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterClickExternalLinkTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterClickExternalLinkTest.java
@@ -14,10 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import org.apache.wicket.MockPageWithLink;
 import org.apache.wicket.markup.html.link.ExternalLink;
+import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterCookieTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterCookieTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterCookieTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterCookieTest.java
index c4aa53c..3243b81 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterCookieTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterCookieTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -29,11 +29,13 @@ import java.util.List;
 import java.util.Map;
 import javax.servlet.http.Cookie;
 
+import org.apache.wicket.core.util.util.tester.apps_1.CreateBook;
+import org.apache.wicket.core.util.util.tester.cookies.CollectAllRequestCookiesPage;
+import org.apache.wicket.core.util.util.tester.cookies.EndPage;
+import org.apache.wicket.core.util.util.tester.cookies.SetCookiePage;
 import org.apache.wicket.protocol.http.mock.Cookies;
-import org.apache.wicket.util.tester.apps_1.CreateBook;
-import org.apache.wicket.util.tester.cookies.CollectAllRequestCookiesPage;
-import org.apache.wicket.util.tester.cookies.EndPage;
-import org.apache.wicket.util.tester.cookies.SetCookiePage;
+import org.apache.wicket.util.tester.WicketTestCase;
+import org.apache.wicket.util.tester.WicketTester;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessBase.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessBase.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessBase.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessBase.java
index fb62b82..7c8a5c2 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessBase.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessBase.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -29,6 +29,7 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.StringResourceStream;
+import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessOnePassTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessOnePassTest.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessOnePassTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessOnePassTest.java
index 1bfd770..3888994 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessOnePassTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessOnePassTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.protocol.http.WebApplication;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessRedirectToBufferTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessRedirectToBufferTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessRedirectToBufferTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessRedirectToBufferTest.java
index c7f3c48..313f432 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessRedirectToBufferTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessRedirectToBufferTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.IMarkupResourceStreamProvider;
@@ -25,6 +25,7 @@ import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.settings.RequestCycleSettings;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.StringResourceStream;
+import org.apache.wicket.util.tester.FormTester;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessRedirectToRenderTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessRedirectToRenderTest.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessRedirectToRenderTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessRedirectToRenderTest.java
index 5cec01a..1d68bfe 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterLazyIsPageStatelessRedirectToRenderTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterLazyIsPageStatelessRedirectToRenderTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import org.apache.wicket.mock.MockApplication;
 import org.apache.wicket.protocol.http.WebApplication;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterSessionCreationTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterSessionCreationTest.java
similarity index 90%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterSessionCreationTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterSessionCreationTest.java
index efda451..4fee700 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterSessionCreationTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterSessionCreationTest.java
@@ -14,12 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.Locale;
 
+import org.apache.wicket.util.tester.DummyHomePage;
+import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterSessionInvalidateTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterSessionInvalidateTest.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterSessionInvalidateTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterSessionInvalidateTest.java
index ce207f4..ca14ce4 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterSessionInvalidateTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterSessionInvalidateTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -26,6 +26,7 @@ import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.apache.wicket.util.resource.StringResourceStream;
+import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterTest.java
index 3799b7c..faae56e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/WicketTesterTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/WicketTesterTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester;
+package org.apache.wicket.core.util.util.tester;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -44,6 +44,14 @@ import org.apache.wicket.authorization.IAuthorizationStrategy;
 import org.apache.wicket.core.request.handler.BookmarkablePageRequestHandler;
 import org.apache.wicket.core.request.handler.IPageProvider;
 import org.apache.wicket.core.request.handler.PageProvider;
+import org.apache.wicket.core.util.util.tester.apps_1.Book;
+import org.apache.wicket.core.util.util.tester.apps_1.CreateBook;
+import org.apache.wicket.core.util.util.tester.apps_1.MyMockApplication;
+import org.apache.wicket.core.util.util.tester.apps_1.SuccessPage;
+import org.apache.wicket.core.util.util.tester.apps_1.ViewBook;
+import org.apache.wicket.core.util.util.tester.apps_6.LinkPage;
+import org.apache.wicket.core.util.util.tester.apps_6.ResultPage;
+import org.apache.wicket.core.util.util.tester.apps_8.ComponentFeedbackResourceTestingPage;
 import org.apache.wicket.feedback.ExactLevelFeedbackMessageFilter;
 import org.apache.wicket.feedback.FeedbackMessage;
 import org.apache.wicket.markup.ComponentTag;
@@ -70,17 +78,12 @@ import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.resource.DummyPage;
 import org.apache.wicket.session.HttpSessionStore;
 import org.apache.wicket.util.string.StringValue;
+import org.apache.wicket.util.tester.DummyHomePage;
 import org.apache.wicket.util.tester.DummyHomePage.TestLink;
-import org.apache.wicket.util.tester.MockPageParameterPage.MockInnerClassPage;
-import org.apache.wicket.util.tester.MockPageWithFormAndAjaxFormSubmitBehavior.Pojo;
-import org.apache.wicket.util.tester.apps_1.Book;
-import org.apache.wicket.util.tester.apps_1.CreateBook;
-import org.apache.wicket.util.tester.apps_1.MyMockApplication;
-import org.apache.wicket.util.tester.apps_1.SuccessPage;
-import org.apache.wicket.util.tester.apps_1.ViewBook;
-import org.apache.wicket.util.tester.apps_6.LinkPage;
-import org.apache.wicket.util.tester.apps_6.ResultPage;
-import org.apache.wicket.util.tester.apps_8.ComponentFeedbackResourceTestingPage;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.core.util.util.tester.MockPageWithFormAndAjaxFormSubmitBehavior.Pojo;
+import org.apache.wicket.util.tester.Result;
+import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -452,10 +455,10 @@ class WicketTesterTest extends WicketTestCase
 	@Test
 	void constructorAndInnerPage() throws Exception
 	{
-		tester.startPage(new MockInnerClassPage());
+		tester.startPage(new MockPageParameterPage.MockInnerClassPage());
 
 		// assertion
-		tester.assertRenderedPage(MockInnerClassPage.class);
+		tester.assertRenderedPage(MockPageParameterPage.MockInnerClassPage.class);
 		tester.assertComponent("title", Label.class);
 		tester.assertContains("Hello world!");
 	}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/Book.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/Book.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/Book.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/Book.java
index 4121ece..ebc0d0a 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/Book.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/Book.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_1;
+package org.apache.wicket.core.util.util.tester.apps_1;
 
 import java.io.Serializable;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/CreateBook.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/CreateBook.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/CreateBook.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/CreateBook.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/CreateBook.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/CreateBook.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/CreateBook.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/CreateBook.java
index ed52918..9d7d3dd 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/CreateBook.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/CreateBook.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_1;
+package org.apache.wicket.core.util.util.tester.apps_1;
 
 import org.apache.wicket.Page;
 import org.apache.wicket.markup.html.WebPage;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/CreateBook.properties b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/CreateBook.properties
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/CreateBook.properties
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/CreateBook.properties
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/MyMockApplication.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/MyMockApplication.java
index e094a7b..fc2c5c2 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/MyMockApplication.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_1;
+package org.apache.wicket.core.util.util.tester.apps_1;
 
 import org.apache.wicket.mock.MockApplication;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication.properties b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/MyMockApplication.properties
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication.properties
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/MyMockApplication.properties
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication_de.properties b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/MyMockApplication_de.properties
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication_de.properties
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/MyMockApplication_de.properties
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication_nl.properties b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/MyMockApplication_nl.properties
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/MyMockApplication_nl.properties
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/MyMockApplication_nl.properties
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/SuccessPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/SuccessPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/SuccessPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/SuccessPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/SuccessPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/SuccessPage.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/SuccessPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/SuccessPage.java
index 145727c..87c0d87 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/SuccessPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/SuccessPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_1;
+package org.apache.wicket.core.util.util.tester.apps_1;
 
 import org.apache.wicket.markup.html.WebPage;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/ViewBook.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/ViewBook.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/ViewBook.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/ViewBook.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/ViewBook.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/ViewBook.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/ViewBook.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/ViewBook.java
index ccd13bf..c4fb467 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_1/ViewBook.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_1/ViewBook.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_1;
+package org.apache.wicket.core.util.util.tester.apps_1;
 
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.basic.Label;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/LoginPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/LoginPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/LoginPage.java
similarity index 94%
copy from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java
copy to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/LoginPage.java
index 3e7d86a..092bcf7 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/LoginPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_2;
+package org.apache.wicket.core.util.util.tester.apps_2;
 
 import org.apache.wicket.markup.html.WebPage;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/RedirectPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/RedirectPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/RedirectPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/RedirectPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/RedirectPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/RedirectPage.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/RedirectPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/RedirectPage.java
index cbb7a28..be58983 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/RedirectPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/RedirectPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_2;
+package org.apache.wicket.core.util.util.tester.apps_2;
 
 import org.apache.wicket.markup.html.WebPage;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/Test.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/Test.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/Test.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/Test.java
index fc9a5b0..958163e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/Test.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_2/Test.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_2;
+package org.apache.wicket.core.util.util.tester.apps_2;
 
 import org.apache.wicket.authorization.IAuthorizationStrategy;
 import org.apache.wicket.authorization.strategies.page.SimplePageAuthorizationStrategy;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_3/ChoicePage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_3/ChoicePage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_3/ChoicePage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_3/ChoicePage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_3/ChoicePage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_3/ChoicePage.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_3/ChoicePage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_3/ChoicePage.java
index ac41e38..f2e75b0 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_3/ChoicePage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_3/ChoicePage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_3;
+package org.apache.wicket.core.util.util.tester.apps_3;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -39,7 +39,7 @@ import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.CompoundPropertyModel;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.util.tester.apps_1.Book;
+import org.apache.wicket.core.util.util.tester.apps_1.Book;
 
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_3/FormTesterTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_3/FormTesterTest.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_3/FormTesterTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_3/FormTesterTest.java
index ff65101..255697b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_3/FormTesterTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_3/FormTesterTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_3;
+package org.apache.wicket.core.util.util.tester.apps_3;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -27,7 +27,7 @@ import java.util.List;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.util.tester.FormTester;
 import org.apache.wicket.util.tester.WicketTestCase;
-import org.apache.wicket.util.tester.apps_1.Book;
+import org.apache.wicket.core.util.util.tester.apps_1.Book;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_4/EmailPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_4/EmailPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_4/EmailPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_4/EmailPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_4/EmailPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_4/EmailPage.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_4/EmailPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_4/EmailPage.java
index b71f152..d4911ba 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_4/EmailPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_4/EmailPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_4;
+package org.apache.wicket.core.util.util.tester.apps_4;
 
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.Form;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_4/EmailPage.properties b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_4/EmailPage.properties
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_4/EmailPage.properties
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_4/EmailPage.properties
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_4/FormTesterTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_4/FormTesterTest.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_4/FormTesterTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_4/FormTesterTest.java
index 8a4b12e..247cb76 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_4/FormTesterTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_4/FormTesterTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_4;
+package org.apache.wicket.core.util.util.tester.apps_4;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/AjaxLinkClickTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/AjaxLinkClickTest.java
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/AjaxLinkClickTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/AjaxLinkClickTest.java
index cf9a8e5..7c52d35 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/AjaxLinkClickTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/AjaxLinkClickTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_5;
+package org.apache.wicket.core.util.util.tester.apps_5;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/AjaxSubmitLinkClickTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/AjaxSubmitLinkClickTest.java
similarity index 93%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/AjaxSubmitLinkClickTest.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/AjaxSubmitLinkClickTest.java
index d482026..fd69dfe 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/AjaxSubmitLinkClickTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/AjaxSubmitLinkClickTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_5;
+package org.apache.wicket.core.util.util.tester.apps_5;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -22,7 +22,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
 import org.apache.wicket.util.tester.WicketTestCase;
-import org.apache.wicket.util.tester.apps_5.MockPageWithFormAndLink.MockPojo;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -50,7 +49,7 @@ class AjaxSubmitLinkClickTest extends WicketTestCase
 	@Test
 	void testClickLinkInsideForm_ajaxSubmitLink()
 	{
-		MockPojo mockPojo = new MockPageWithFormAndLink.MockPojo();
+		MockPageWithFormAndLink.MockPojo mockPojo = new MockPageWithFormAndLink.MockPojo();
 		mockPojo.setName("Mock name");
 
 		final MockPageWithFormAndContainedLink page = new MockPageWithFormAndContainedLink(mockPojo);
@@ -95,7 +94,7 @@ class AjaxSubmitLinkClickTest extends WicketTestCase
 	@Test
 	void testClickLink_ajaxSubmitLink()
 	{
-		MockPojo mockPojo = new MockPageWithFormAndLink.MockPojo();
+		MockPageWithFormAndLink.MockPojo mockPojo = new MockPageWithFormAndLink.MockPojo();
 		mockPojo.setName("Mock name");
 
 		final MockPageWithFormAndLink page = new MockPageWithFormAndLink(mockPojo);
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithFormAndContainedLink.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithFormAndContainedLink.html
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithFormAndContainedLink.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithFormAndContainedLink.html
index 6f55bc8..61b9b59 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithFormAndContainedLink.html
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithFormAndContainedLink.html
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<title>Insert title here</title>
-</head>
-<body>
-<form wicket:id="form">
-<input type="text" wicket:id="name" />
-<a href="#" wicket:id="link">Link</a>
-</form>
-</body>
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>Insert title here</title>
+</head>
+<body>
+<form wicket:id="form">
+<input type="text" wicket:id="name" />
+<a href="#" wicket:id="link">Link</a>
+</form>
+</body>
 </html>
\ No newline at end of file
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithFormAndContainedLink.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithFormAndContainedLink.java
similarity index 93%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithFormAndContainedLink.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithFormAndContainedLink.java
index 049750e..37f962b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithFormAndContainedLink.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithFormAndContainedLink.java
@@ -1,50 +1,50 @@
-/*
- * 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.util.tester.apps_5;
-
-import org.apache.wicket.markup.html.link.AbstractLink;
-
-/**
- * Contains a form with a textfield on it and a link inside the form. Use the
- * {@link #addLink(AbstractLink)} method to add a link to the form.
- * 
- * @author Gerolf Seitz
- */
-public class MockPageWithFormAndContainedLink extends MockPageWithFormAndLink
-{
-
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Construct.
-	 * 
-	 * @param mockPojo
-	 */
-	public MockPageWithFormAndContainedLink(MockPojo mockPojo)
-	{
-		super(mockPojo);
-	}
-
-	/**
-	 * @param link
-	 */
-	public void addLink(AbstractLink link)
-	{
-		getForm().add(link);
-	}
-
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util.tester.apps_5;
+
+import org.apache.wicket.markup.html.link.AbstractLink;
+
+/**
+ * Contains a form with a textfield on it and a link inside the form. Use the
+ * {@link #addLink(AbstractLink)} method to add a link to the form.
+ * 
+ * @author Gerolf Seitz
+ */
+public class MockPageWithFormAndContainedLink extends MockPageWithFormAndLink
+{
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param mockPojo
+	 */
+	public MockPageWithFormAndContainedLink(MockPojo mockPojo)
+	{
+		super(mockPojo);
+	}
+
+	/**
+	 * @param link
+	 */
+	public void addLink(AbstractLink link)
+	{
+		getForm().add(link);
+	}
+
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithFormAndLink.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithFormAndLink.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithFormAndLink.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithFormAndLink.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithFormAndLink.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithFormAndLink.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithFormAndLink.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithFormAndLink.java
index 803d9f0..6590d9c 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithFormAndLink.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithFormAndLink.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_5;
+package org.apache.wicket.core.util.util.tester.apps_5;
 
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.form.Form;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithLink.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithLink.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithLink.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithLink.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithLink.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithLink.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithLink.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithLink.java
index 2e9c30a..076ade1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_5/MockPageWithLink.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_5/MockPageWithLink.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_5;
+package org.apache.wicket.core.util.util.tester.apps_5;
 
 import org.apache.wicket.markup.html.WebPage;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_6/LinkPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_6/LinkPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_6/LinkPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_6/LinkPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_6/LinkPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_6/LinkPage.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_6/LinkPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_6/LinkPage.java
index bc9d6de..6f7f205 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_6/LinkPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_6/LinkPage.java
@@ -1,133 +1,133 @@
-/*
- * 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.util.tester.apps_6;
-
-import java.util.Optional;
-
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.link.Link;
-import org.apache.wicket.util.tester.WicketTester;
-
-/**
- * Different kinds of links, to be test the {@link WicketTester#clickLink(String, boolean)} method.
- * 
- * Add more links when needed.
- */
-public class LinkPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Construct.
-	 */
-	public LinkPage()
-	{
-		// Link
-		add(new Link<Void>("linkWithSetResponsePageClass")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick()
-			{
-				getRequestCycle().setResponsePage(ResultPage.class);
-			}
-		});
-
-		add(new Link<Void>("linkWithSetResponsePage")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick()
-			{
-				getRequestCycle().setResponsePage(new ResultPage("A special label"));
-			}
-		});
-
-		// AjaxLink
-		add(new AjaxLink<Void>("ajaxLinkWithSetResponsePageClass")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick(AjaxRequestTarget target)
-			{
-				getRequestCycle().setResponsePage(ResultPage.class);
-			}
-		});
-
-		add(new AjaxLink<Void>("ajaxLinkWithSetResponsePage")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick(AjaxRequestTarget target)
-			{
-				getRequestCycle().setResponsePage(new ResultPage("A special label"));
-			}
-		});
-
-		// AjaxFallbackLink
-		add(new AjaxFallbackLink<Void>("ajaxFallbackLinkWithSetResponsePageClass")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick(Optional<AjaxRequestTarget> targetOptional)
-			{
-				getRequestCycle().setResponsePage(ResultPage.class);
-			}
-		});
-
-		add(new AjaxFallbackLink<Void>("ajaxFallbackLinkWithSetResponsePage")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick(Optional<AjaxRequestTarget> targetOptional)
-			{
-				getRequestCycle().setResponsePage(new ResultPage("A special label"));
-			}
-		});
-
-		// AjaxSubmitLink
-		final Form<Void> form = new Form<Void>("form");
-		add(form);
-		final AjaxSubmitLink submit = new AjaxSubmitLink("submit")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected void onSubmit(final AjaxRequestTarget target)
-			{
-				getRequestCycle().setResponsePage(new ResultPage("A form label"));
-			}
-
-			@Override
-			protected void onError(AjaxRequestTarget target)
-			{
-			}
-		};
-		form.add(submit);
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util.tester.apps_6;
+
+import java.util.Optional;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.util.tester.WicketTester;
+
+/**
+ * Different kinds of links, to be test the {@link WicketTester#clickLink(String, boolean)} method.
+ * 
+ * Add more links when needed.
+ */
+public class LinkPage extends WebPage
+{
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Construct.
+	 */
+	public LinkPage()
+	{
+		// Link
+		add(new Link<Void>("linkWithSetResponsePageClass")
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick()
+			{
+				getRequestCycle().setResponsePage(ResultPage.class);
+			}
+		});
+
+		add(new Link<Void>("linkWithSetResponsePage")
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick()
+			{
+				getRequestCycle().setResponsePage(new ResultPage("A special label"));
+			}
+		});
+
+		// AjaxLink
+		add(new AjaxLink<Void>("ajaxLinkWithSetResponsePageClass")
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(AjaxRequestTarget target)
+			{
+				getRequestCycle().setResponsePage(ResultPage.class);
+			}
+		});
+
+		add(new AjaxLink<Void>("ajaxLinkWithSetResponsePage")
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(AjaxRequestTarget target)
+			{
+				getRequestCycle().setResponsePage(new ResultPage("A special label"));
+			}
+		});
+
+		// AjaxFallbackLink
+		add(new AjaxFallbackLink<Void>("ajaxFallbackLinkWithSetResponsePageClass")
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(Optional<AjaxRequestTarget> targetOptional)
+			{
+				getRequestCycle().setResponsePage(ResultPage.class);
+			}
+		});
+
+		add(new AjaxFallbackLink<Void>("ajaxFallbackLinkWithSetResponsePage")
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public void onClick(Optional<AjaxRequestTarget> targetOptional)
+			{
+				getRequestCycle().setResponsePage(new ResultPage("A special label"));
+			}
+		});
+
+		// AjaxSubmitLink
+		final Form<Void> form = new Form<Void>("form");
+		add(form);
+		final AjaxSubmitLink submit = new AjaxSubmitLink("submit")
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected void onSubmit(final AjaxRequestTarget target)
+			{
+				getRequestCycle().setResponsePage(new ResultPage("A form label"));
+			}
+
+			@Override
+			protected void onError(AjaxRequestTarget target)
+			{
+			}
+		};
+		form.add(submit);
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_6/ResultPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_6/ResultPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_6/ResultPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_6/ResultPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_6/ResultPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_6/ResultPage.java
similarity index 93%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_6/ResultPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_6/ResultPage.java
index f52069b..ccc3660 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_6/ResultPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_6/ResultPage.java
@@ -1,49 +1,49 @@
-/*
- * 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.util.tester.apps_6;
-
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.model.Model;
-
-/**
- * Result page
- */
-public class ResultPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Construct.
-	 */
-	public ResultPage()
-	{
-		this("No Parameter");
-	}
-
-	/**
-	 * Construct.
-	 * 
-	 * @param label
-	 */
-	public ResultPage(String label)
-	{
-		super(new Model<String>(label));
-
-		add(new Label("label", getDefaultModel()));
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util.tester.apps_6;
+
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.Model;
+
+/**
+ * Result page
+ */
+public class ResultPage extends WebPage
+{
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Construct.
+	 */
+	public ResultPage()
+	{
+		this("No Parameter");
+	}
+
+	/**
+	 * Construct.
+	 * 
+	 * @param label
+	 */
+	public ResultPage(String label)
+	{
+		super(new Model<String>(label));
+
+		add(new Label("label", getDefaultModel()));
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/HomePage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/HomePage.html
similarity index 98%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/HomePage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/HomePage.html
index 6cb2be3..48f52ca 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/HomePage.html
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/HomePage.html
@@ -5,12 +5,12 @@
     <body>
         <strong>Wicket Quickstart Archetype Homepage</strong>
         <br/><br/>
-        <span wicket:id="message">message will be here</span>
-        
-        <form wicket:id="form">
-        Input field: <input type="text" wicket:id="inputField" />
-        <input type="submit" wicket:id="hiddenButton" value="Submit"/>
-        <input type="submit" wicket:id="ajaxButton" value="Submit"/>
+        <span wicket:id="message">message will be here</span>
+        
+        <form wicket:id="form">
+        Input field: <input type="text" wicket:id="inputField" />
+        <input type="submit" wicket:id="hiddenButton" value="Submit"/>
+        <input type="submit" wicket:id="ajaxButton" value="Submit"/>
         </form>
     </body>
 </html>
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/HomePage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/HomePage.java
similarity index 97%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/HomePage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/HomePage.java
index 0a6f6fe..a41d7db 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/HomePage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/HomePage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_7;
+package org.apache.wicket.core.util.util.tester.apps_7;
 
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.form.AjaxButton;
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/TestHomePage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/TestHomePage.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/TestHomePage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/TestHomePage.java
index 1246034..90c7ea8 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/TestHomePage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/TestHomePage.java
@@ -1,42 +1,42 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.util.tester.apps_7;
-
-import org.apache.wicket.util.tester.WicketTestCase;
-import org.junit.jupiter.api.Test;
-
-/**
- * Simple test using the WicketTester
- */
-class TestHomePage extends WicketTestCase
-{
-	/**	 */
-	@Test
-    void testAjaxSubmitWhileAnotherButtonIsNotVisible()
-	{
-		// start and render the test page
-		tester.startPage(HomePage.class);
-		// assert rendered page class
-		tester.assertRenderedPage(HomePage.class);
-		// assert rendered label component
-		tester.assertLabel("message",
-			"If you see this message wicket is properly configured and running");
-
-		// execute ajax
-		tester.executeAjaxEvent("form:ajaxButton", "click");
-	}
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.core.util.util.tester.apps_7;
+
+import org.apache.wicket.util.tester.WicketTestCase;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Simple test using the WicketTester
+ */
+class TestHomePage extends WicketTestCase
+{
+	/**	 */
+	@Test
+    void testAjaxSubmitWhileAnotherButtonIsNotVisible()
+	{
+		// start and render the test page
+		tester.startPage(HomePage.class);
+		// assert rendered page class
+		tester.assertRenderedPage(HomePage.class);
+		// assert rendered label component
+		tester.assertLabel("message",
+			"If you see this message wicket is properly configured and running");
+
+		// execute ajax
+		tester.executeAjaxEvent("form:ajaxButton", "click");
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/WicketApplication.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/WicketApplication.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/WicketApplication.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/WicketApplication.java
index e5ab674..0b0f841 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_7/WicketApplication.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_7/WicketApplication.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_7;
+package org.apache.wicket.core.util.util.tester.apps_7;
 
 import org.apache.wicket.protocol.http.WebApplication;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_8/ComponentFeedbackResourceTestingPage.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_8/ComponentFeedbackResourceTestingPage.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_8/ComponentFeedbackResourceTestingPage.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_8/ComponentFeedbackResourceTestingPage.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_8/ComponentFeedbackResourceTestingPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_8/ComponentFeedbackResourceTestingPage.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_8/ComponentFeedbackResourceTestingPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_8/ComponentFeedbackResourceTestingPage.java
index fec8efc..885f40f 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_8/ComponentFeedbackResourceTestingPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_8/ComponentFeedbackResourceTestingPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_8;
+package org.apache.wicket.core.util.util.tester.apps_8;
 
 import org.apache.wicket.markup.html.WebPage;
 
@@ -27,4 +27,4 @@ public class ComponentFeedbackResourceTestingPage extends WebPage
 	{
 		add(new TestResourceProvidingLabel("label"));
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_8/TestResourceProvidingLabel.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_8/TestResourceProvidingLabel.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_8/TestResourceProvidingLabel.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_8/TestResourceProvidingLabel.java
index b3a30ca..29b25a3 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_8/TestResourceProvidingLabel.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_8/TestResourceProvidingLabel.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_8;
+package org.apache.wicket.core.util.util.tester.apps_8;
 
 import org.apache.wicket.markup.html.basic.Label;
 
@@ -38,4 +38,4 @@ class TestResourceProvidingLabel extends Label
 		error(this.getString("error.msg"));
 		info(this.getString("info.msg"));
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_8/TestResourceProvidingLabel.properties b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_8/TestResourceProvidingLabel.properties
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_8/TestResourceProvidingLabel.properties
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/apps_8/TestResourceProvidingLabel.properties
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/bg.jpg b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/bg.jpg
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/bg.jpg
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/bg.jpg
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/cookies/CollectAllRequestCookiesPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/cookies/CollectAllRequestCookiesPage.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/cookies/CollectAllRequestCookiesPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/cookies/CollectAllRequestCookiesPage.java
index 9e0e6f5..ddf3d4c 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/cookies/CollectAllRequestCookiesPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/cookies/CollectAllRequestCookiesPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.cookies;
+package org.apache.wicket.core.util.util.tester.cookies;
 
 import java.util.List;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/cookies/EndPage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/cookies/EndPage.java
similarity index 94%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/cookies/EndPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/cookies/EndPage.java
index 4bed69f..dd4b6b5 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/cookies/EndPage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/cookies/EndPage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.cookies;
+package org.apache.wicket.core.util.util.tester.cookies;
 
 import org.apache.wicket.util.tester.DummyHomePage;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/cookies/SetCookiePage.java b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/cookies/SetCookiePage.java
similarity index 96%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/cookies/SetCookiePage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/cookies/SetCookiePage.java
index dd2c49b..ac05fe5 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/cookies/SetCookiePage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/cookies/SetCookiePage.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.cookies;
+package org.apache.wicket.core.util.util.tester.cookies;
 
 import javax.servlet.http.Cookie;
 
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/test.html b/wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/test.html
similarity index 100%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/test.html
rename to wicket-core/src/test/java/org/apache/wicket/core/util/util/tester/test.html
diff --git a/wicket-core/src/test/java/org/apache/wicket/resource/InvalidResourceSpecificationExceptionTest.java b/wicket-core/src/test/java/org/apache/wicket/resource/InvalidResourceSpecificationExceptionTest.java
index 2e370ca..e484887 100644
--- a/wicket-core/src/test/java/org/apache/wicket/resource/InvalidResourceSpecificationExceptionTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/resource/InvalidResourceSpecificationExceptionTest.java
@@ -17,7 +17,7 @@
 package org.apache.wicket.resource;
 
 import org.apache.wicket.WicketRuntimeException;
-import org.apache.wicket.util.ExceptionTestBase;
+import org.apache.wicket.core.util.util.ExceptionTestBase;
 
 
 /**
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java b/wicket-devutils/src/main/java/module-info.java
similarity index 56%
copy from wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
copy to wicket-devutils/src/main/java/module-info.java
index af4fe15..e9133eb 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
+++ b/wicket-devutils/src/main/java/module-info.java
@@ -14,27 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
 
-abstract class AbstractVariations
-{
-	protected abstract VariationIterator<?> last();
+module org.apache.wicket.devutils {
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.request;
+    requires org.apache.wicket.core;
+    requires org.apache.wicket.extensions;
+    requires org.slf4j;
 
-	public abstract boolean getResult();
-
-	public boolean hasNextVariation()
-	{
-		return last().hasNext();
-	}
-
-	public void nextVariation()
-	{
-		last().next();
-	}
-
-	void toString(StringBuilder sb, String label, VariationIterator<?> iterator)
-	{
-		sb.append(label).append('=').append(iterator.current()).append(',');
-	}
+    provides org.apache.wicket.IInitializer with org.apache.wicket.devutils.debugbar.DebugBarInitializer;
 
+    exports org.apache.wicket.devutils;
+    exports org.apache.wicket.devutils.debugbar;
+    exports org.apache.wicket.devutils.inspector;
+    exports org.apache.wicket.devutils.pagestore;
+    exports org.apache.wicket.devutils.pagestore.browser;
+    exports org.apache.wicket.devutils.stateless;
 }
diff --git a/wicket-devutils/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java b/wicket-devutils/src/test/java/org/apache/wicket/devutils/util/license/ApacheLicenceHeaderTest.java
similarity index 91%
rename from wicket-devutils/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
rename to wicket-devutils/src/test/java/org/apache/wicket/devutils/util/license/ApacheLicenceHeaderTest.java
index 7efc3af..cf8598a 100644
--- a/wicket-devutils/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ b/wicket-devutils/src/test/java/org/apache/wicket/devutils/util/license/ApacheLicenceHeaderTest.java
@@ -14,7 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.license;
+package org.apache.wicket.devutils.util.license;
+
+import org.apache.wicket.util.license.ApacheLicenseHeaderTestCase;
 
 /**
  * Test that the license headers are in place in this project. The tests are run from
diff --git a/wicket-extensions/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java b/wicket-devutils/src/test/java/org/apache/wicket/devutils/util/markup/xhtml/WellFormedXmlTest.java
similarity index 89%
rename from wicket-extensions/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
rename to wicket-devutils/src/test/java/org/apache/wicket/devutils/util/markup/xhtml/WellFormedXmlTest.java
index 88d9025..153165b 100644
--- a/wicket-extensions/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
+++ b/wicket-devutils/src/test/java/org/apache/wicket/devutils/util/markup/xhtml/WellFormedXmlTest.java
@@ -1,34 +1,35 @@
-/*
- * 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.util.markup.xhtml;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * Checks that the html markup files are well formed xml-s.
- * 
- * @author akiraly
- */
-public class WellFormedXmlTest extends WellFormedXmlTestCase
-{
-	@Test
-	@Override
-	public void markupFiles()
-	{
-		super.markupFiles();
-	}
-}
+/*
+ * 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.devutils.util.markup.xhtml;
+
+import org.apache.wicket.util.markup.xhtml.WellFormedXmlTestCase;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Checks that the html markup files are well formed xml-s.
+ * 
+ * @author akiraly
+ */
+public class WellFormedXmlTest extends WellFormedXmlTestCase
+{
+	@Test
+	@Override
+	public void markupFiles()
+	{
+		super.markupFiles();
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java b/wicket-experimental/wicket-metrics/src/main/java/module-info.java
similarity index 50%
copy from wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
copy to wicket-experimental/wicket-metrics/src/main/java/module-info.java
index af4fe15..2706ccb 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
+++ b/wicket-experimental/wicket-metrics/src/main/java/module-info.java
@@ -14,27 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
 
-abstract class AbstractVariations
-{
-	protected abstract VariationIterator<?> last();
-
-	public abstract boolean getResult();
-
-	public boolean hasNextVariation()
-	{
-		return last().hasNext();
-	}
-
-	public void nextVariation()
-	{
-		last().next();
-	}
-
-	void toString(StringBuilder sb, String label, VariationIterator<?> iterator)
-	{
-		sb.append(label).append('=').append(iterator.current()).append(',');
-	}
+module org.apache.wicket.metrics {
+    requires org.apache.wicket.core;
+    requires org.aspectj.runtime;
+    requires com.codahale.metrics;
+    requires com.codahale.metrics.jmx;
+    requires javax.servlet.api;
 
+    exports org.apache.wicket.metrics;
+    exports org.apache.wicket.metrics.aspects;
+    exports org.apache.wicket.metrics.aspects.ajax;
+    exports org.apache.wicket.metrics.aspects.behavior;
+    exports org.apache.wicket.metrics.aspects.component;
+    exports org.apache.wicket.metrics.aspects.markup;
+    exports org.apache.wicket.metrics.aspects.model;
+    exports org.apache.wicket.metrics.aspects.request;
+    exports org.apache.wicket.metrics.aspects.requesthandler;
+    exports org.apache.wicket.metrics.aspects.resource;
+    exports org.apache.wicket.metrics.aspects.session;
 }
diff --git a/wicket-extensions/src/main/java/module-info.java b/wicket-extensions/src/main/java/module-info.java
new file mode 100644
index 0000000..2edde99
--- /dev/null
+++ b/wicket-extensions/src/main/java/module-info.java
@@ -0,0 +1,74 @@
+/*
+ * 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.
+ */
+
+module org.apache.wicket.extensions {
+    requires java.desktop;
+    requires javax.servlet.api;
+    requires org.slf4j;
+    requires com.fasterxml.jackson.databind;
+    requires com.github.openjson;
+    requires commons.fileupload;
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.request;
+    requires org.apache.wicket.core;
+    requires org.danekja.jdk.serializable.functional;
+
+    provides org.apache.wicket.IInitializer with org.apache.wicket.extensions.Initializer;
+
+    exports org.apache.wicket.extensions;
+    exports org.apache.wicket.extensions.ajax;
+    exports org.apache.wicket.extensions.ajax.markup.html;
+    exports org.apache.wicket.extensions.ajax.markup.html.autocomplete;
+    exports org.apache.wicket.extensions.ajax.markup.html.form.upload;
+    exports org.apache.wicket.extensions.ajax.markup.html.modal;
+    exports org.apache.wicket.extensions.ajax.markup.html.modal.theme;
+    exports org.apache.wicket.extensions.ajax.markup.html.repeater;
+    exports org.apache.wicket.extensions.ajax.markup.html.repeater.data.sort;
+    exports org.apache.wicket.extensions.ajax.markup.html.repeater.data.table;
+    exports org.apache.wicket.extensions.ajax.markup.html.tabs;
+    exports org.apache.wicket.extensions.breadcrumb;
+    exports org.apache.wicket.extensions.breadcrumb.panel;
+    exports org.apache.wicket.extensions.captcha.kittens;
+    exports org.apache.wicket.extensions.markup.html.basic;
+    exports org.apache.wicket.extensions.markup.html.captcha;
+    exports org.apache.wicket.extensions.markup.html.form;
+    exports org.apache.wicket.extensions.markup.html.form.datetime;
+    exports org.apache.wicket.extensions.markup.html.form.palette;
+    exports org.apache.wicket.extensions.markup.html.form.palette.component;
+    exports org.apache.wicket.extensions.markup.html.form.palette.theme;
+    exports org.apache.wicket.extensions.markup.html.form.select;
+    exports org.apache.wicket.extensions.markup.html.image.resource;
+    exports org.apache.wicket.extensions.markup.html.repeater.data.grid;
+    exports org.apache.wicket.extensions.markup.html.repeater.data.sort;
+    exports org.apache.wicket.extensions.markup.html.repeater.data.table;
+    exports org.apache.wicket.extensions.markup.html.repeater.data.table.export;
+    exports org.apache.wicket.extensions.markup.html.repeater.data.table.filter;
+    exports org.apache.wicket.extensions.markup.html.repeater.tree;
+    exports org.apache.wicket.extensions.markup.html.repeater.tree.content;
+    exports org.apache.wicket.extensions.markup.html.repeater.tree.nested;
+    exports org.apache.wicket.extensions.markup.html.repeater.tree.table;
+    exports org.apache.wicket.extensions.markup.html.repeater.tree.theme;
+    exports org.apache.wicket.extensions.markup.html.repeater.util;
+    exports org.apache.wicket.extensions.markup.html.tabs;
+    exports org.apache.wicket.extensions.model;
+    exports org.apache.wicket.extensions.rating;
+    exports org.apache.wicket.extensions.requestlogger;
+    exports org.apache.wicket.extensions.util.encoding;
+    exports org.apache.wicket.extensions.validation.validator;
+    exports org.apache.wicket.extensions.wizard;
+    exports org.apache.wicket.extensions.wizard.dynamic;
+}
diff --git a/wicket-guice/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/util/license/ApacheLicenceHeaderTest.java
similarity index 91%
copy from wicket-guice/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
copy to wicket-extensions/src/test/java/org/apache/wicket/extensions/util/license/ApacheLicenceHeaderTest.java
index 07e18e8..4a0c427 100644
--- a/wicket-guice/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/util/license/ApacheLicenceHeaderTest.java
@@ -14,8 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.license;
+package org.apache.wicket.extensions.util.license;
 
+import org.apache.wicket.util.license.ApacheLicenseHeaderTestCase;
 
 /**
  * Test that the license headers are in place in this project. The tests are run from
diff --git a/wicket-devutils/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/util/markup/xhtml/WellFormedXmlTest.java
similarity index 89%
rename from wicket-devutils/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
rename to wicket-extensions/src/test/java/org/apache/wicket/extensions/util/markup/xhtml/WellFormedXmlTest.java
index 88d9025..412dd04 100644
--- a/wicket-devutils/src/test/java/org/apache/wicket/util/markup/xhtml/WellFormedXmlTest.java
+++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/util/markup/xhtml/WellFormedXmlTest.java
@@ -1,34 +1,35 @@
-/*
- * 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.util.markup.xhtml;
-
-import org.junit.jupiter.api.Test;
-
-/**
- * Checks that the html markup files are well formed xml-s.
- * 
- * @author akiraly
- */
-public class WellFormedXmlTest extends WellFormedXmlTestCase
-{
-	@Test
-	@Override
-	public void markupFiles()
-	{
-		super.markupFiles();
-	}
-}
+/*
+ * 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.extensions.util.markup.xhtml;
+
+import org.apache.wicket.util.markup.xhtml.WellFormedXmlTestCase;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Checks that the html markup files are well formed xml-s.
+ * 
+ * @author akiraly
+ */
+public class WellFormedXmlTest extends WellFormedXmlTestCase
+{
+	@Test
+	@Override
+	public void markupFiles()
+	{
+		super.markupFiles();
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java b/wicket-guice/src/main/java/module-info.java
similarity index 74%
copy from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java
copy to wicket-guice/src/main/java/module-info.java
index 3e7d86a..926d1e6 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java
+++ b/wicket-guice/src/main/java/module-info.java
@@ -14,15 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_2;
 
-import org.apache.wicket.markup.html.WebPage;
+module org.apache.wicket.guice {
+    requires javax.servlet.api;
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.core;
+    requires org.apache.wicket.ioc;
+    requires javax.inject;
+    requires com.google.guice;
 
-/**
- * 
- * @author Juergen Donnerstag
- */
-public class LoginPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
+    exports org.apache.wicket.guice;
 }
diff --git a/wicket-ioc/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java b/wicket-guice/src/test/java/org/apache/wicket/guice/util/license/ApacheLicenceHeaderTest.java
similarity index 91%
rename from wicket-ioc/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
rename to wicket-guice/src/test/java/org/apache/wicket/guice/util/license/ApacheLicenceHeaderTest.java
index 994fb78..b2732c8 100644
--- a/wicket-ioc/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ b/wicket-guice/src/test/java/org/apache/wicket/guice/util/license/ApacheLicenceHeaderTest.java
@@ -1,34 +1,37 @@
-/*
- * 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.util.license;
-
-/**
- * Test that the license headers are in place in this project. The tests are run from
- * {@link ApacheLicenseHeaderTestCase}, but you can add project specific tests here if needed.
- * 
- * @author Frank Bille Jensen (frankbille)
- */
-public class ApacheLicenceHeaderTest extends ApacheLicenseHeaderTestCase
-{
-	/**
-	 * Construct.
-	 */
-	public ApacheLicenceHeaderTest()
-	{
-		// addHeaders = true;
-	}
-}
+/*
+ * 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.guice.util.license;
+
+
+import org.apache.wicket.util.license.ApacheLicenseHeaderTestCase;
+
+/**
+ * Test that the license headers are in place in this project. The tests are run from
+ * {@link ApacheLicenseHeaderTestCase}, but you can add project specific tests here if needed.
+ * 
+ * @author Frank Bille Jensen (frankbille)
+ */
+public class ApacheLicenceHeaderTest extends ApacheLicenseHeaderTestCase
+{
+	/**
+	 * Construct.
+	 */
+	public ApacheLicenceHeaderTest()
+	{
+		// addHeaders = true;
+	}
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java b/wicket-ioc/src/main/java/module-info.java
similarity index 74%
copy from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java
copy to wicket-ioc/src/main/java/module-info.java
index 3e7d86a..6f7f7e1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java
+++ b/wicket-ioc/src/main/java/module-info.java
@@ -14,15 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_2;
 
-import org.apache.wicket.markup.html.WebPage;
+module org.apache.wicket.ioc {
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.core;
+    requires cglib;
+    requires org.objenesis;
 
-/**
- * 
- * @author Juergen Donnerstag
- */
-public class LoginPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
+    exports org.apache.wicket.injection;
+    exports org.apache.wicket.proxy;
+    exports org.apache.wicket.proxy.objenesis;
 }
diff --git a/wicket-guice/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java b/wicket-ioc/src/test/java/org/apache/wicket/injection/util/license/ApacheLicenceHeaderTest.java
similarity index 91%
copy from wicket-guice/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
copy to wicket-ioc/src/test/java/org/apache/wicket/injection/util/license/ApacheLicenceHeaderTest.java
index 07e18e8..ec80027 100644
--- a/wicket-guice/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ b/wicket-ioc/src/test/java/org/apache/wicket/injection/util/license/ApacheLicenceHeaderTest.java
@@ -14,8 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.license;
+package org.apache.wicket.injection.util.license;
 
+import org.apache.wicket.util.license.ApacheLicenseHeaderTestCase;
 
 /**
  * Test that the license headers are in place in this project. The tests are run from
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java b/wicket-jmx/src/main/java/module-info.java
similarity index 70%
copy from wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java
copy to wicket-jmx/src/main/java/module-info.java
index fcfc1c5..d07942d 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java
+++ b/wicket-jmx/src/main/java/module-info.java
@@ -14,17 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.lang;
 
-/**
- * @author jcompagner
- */
-public class Person2 extends Person
-{
+module org.apache.wicket.jmx {
+    requires java.management;
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.core;
+    requires org.slf4j;
+    requires cglib;
 
-	@Override
-	public String getName()
-	{
-		return (String)super.getName();
-	}
+    provides org.apache.wicket.IInitializer with org.apache.wicket.jmx.Initializer;
+    exports org.apache.wicket.jmx;
+    exports org.apache.wicket.jmx.wrapper;
 }
diff --git a/wicket-guice/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java b/wicket-jmx/src/test/java/org/apache/wicket/jmx/util/license/ApacheLicenceHeaderTest.java
similarity index 91%
rename from wicket-guice/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
rename to wicket-jmx/src/test/java/org/apache/wicket/jmx/util/license/ApacheLicenceHeaderTest.java
index 07e18e8..99a576d 100644
--- a/wicket-guice/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ b/wicket-jmx/src/test/java/org/apache/wicket/jmx/util/license/ApacheLicenceHeaderTest.java
@@ -14,8 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.license;
+package org.apache.wicket.jmx.util.license;
 
+import org.apache.wicket.util.license.ApacheLicenseHeaderTestCase;
 
 /**
  * Test that the license headers are in place in this project. The tests are run from
diff --git a/wicket-jmx/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java b/wicket-jmx/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
deleted file mode 100644
index 7efc3af..0000000
--- a/wicket-jmx/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ /dev/null
@@ -1,34 +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.util.license;
-
-/**
- * Test that the license headers are in place in this project. The tests are run from
- * {@link ApacheLicenseHeaderTestCase}, but you can add project specific tests here if needed.
- * 
- * @author Frank Bille Jensen (frankbille)
- */
-public class ApacheLicenceHeaderTest extends ApacheLicenseHeaderTestCase
-{
-	/**
-	 * Construct.
-	 */
-	public ApacheLicenceHeaderTest()
-	{
-		// addHeaders = true;
-	}
-}
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/module-info.java
similarity index 58%
copy from wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
copy to wicket-native-websocket/wicket-native-websocket-core/src/main/java/module-info.java
index af4fe15..0ab0bf7 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
+++ b/wicket-native-websocket/wicket-native-websocket-core/src/main/java/module-info.java
@@ -14,27 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
 
-abstract class AbstractVariations
-{
-	protected abstract VariationIterator<?> last();
-
-	public abstract boolean getResult();
-
-	public boolean hasNextVariation()
-	{
-		return last().hasNext();
-	}
-
-	public void nextVariation()
-	{
-		last().next();
-	}
-
-	void toString(StringBuilder sb, String label, VariationIterator<?> iterator)
-	{
-		sb.append(label).append('=').append(iterator.current()).append(',');
-	}
+module org.apache.wicket.native_websocket.core {
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.request;
+    requires org.apache.wicket.core;
+    requires javax.servlet.api;
+    requires org.slf4j;
 
+    exports org.apache.wicket.protocol.ws;
+    exports org.apache.wicket.protocol.ws.api;
+    exports org.apache.wicket.protocol.ws.api.event;
+    exports org.apache.wicket.protocol.ws.api.message;
+    exports org.apache.wicket.protocol.ws.api.registry;
+    exports org.apache.wicket.protocol.ws.concurrent;
+    exports org.apache.wicket.protocol.ws.util.tester;
 }
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/module-info.java
similarity index 69%
rename from wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java
rename to wicket-native-websocket/wicket-native-websocket-javax/src/main/java/module-info.java
index fcfc1c5..32aee40 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java
+++ b/wicket-native-websocket/wicket-native-websocket-javax/src/main/java/module-info.java
@@ -14,17 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.lang;
 
-/**
- * @author jcompagner
- */
-public class Person2 extends Person
-{
+module org.apache.wicket.native_websocket.javax {
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.request;
+    requires org.apache.wicket.core;
+    requires org.apache.wicket.native_websocket.core;
+    requires javax.servlet.api;
+    requires jakarta.websocket.api;
+    requires org.slf4j;
 
-	@Override
-	public String getName()
-	{
-		return (String)super.getName();
-	}
+    exports org.apache.wicket.protocol.ws.javax;
 }
diff --git a/wicket-objectsizeof-agent/src/main/java/module-info.java b/wicket-objectsizeof-agent/src/main/java/module-info.java
new file mode 100644
index 0000000..a680487
--- /dev/null
+++ b/wicket-objectsizeof-agent/src/main/java/module-info.java
@@ -0,0 +1,10 @@
+/**
+ *
+ */
+module org.apache.wicket.objectsizeof.agent {
+    requires java.instrument;
+    requires org.slf4j;
+    requires org.apache.wicket.core;
+
+    exports org.apache.wicket.util.instrument;
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java b/wicket-request/src/main/java/module-info.java
similarity index 54%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
rename to wicket-request/src/main/java/module-info.java
index af4fe15..cc2fe4e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
+++ b/wicket-request/src/main/java/module-info.java
@@ -14,27 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.handler.render;
 
-abstract class AbstractVariations
-{
-	protected abstract VariationIterator<?> last();
-
-	public abstract boolean getResult();
-
-	public boolean hasNextVariation()
-	{
-		return last().hasNext();
-	}
-
-	public void nextVariation()
-	{
-		last().next();
-	}
-
-	void toString(StringBuilder sb, String label, VariationIterator<?> iterator)
-	{
-		sb.append(label).append('=').append(iterator.current()).append(',');
-	}
+module org.apache.wicket.request {
+    requires java.sql;
+    requires org.apache.wicket.util;
+    requires org.slf4j;
+    requires javax.servlet.api;
 
+    exports org.apache.wicket.request;
+    exports org.apache.wicket.request.flow;
+    exports org.apache.wicket.request.handler;
+    exports org.apache.wicket.request.handler.logger;
+    exports org.apache.wicket.request.http;
+    exports org.apache.wicket.request.http.flow;
+    exports org.apache.wicket.request.http.handler;
+    exports org.apache.wicket.request.mapper;
+    exports org.apache.wicket.request.mapper.info;
+    exports org.apache.wicket.request.mapper.parameter;
+    exports org.apache.wicket.request.parameter;
 }
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Country2.java b/wicket-spring/src/main/java/module-info.java
similarity index 64%
rename from wicket-core/src/test/java/org/apache/wicket/util/lang/Country2.java
rename to wicket-spring/src/main/java/module-info.java
index 04ffbad..71feeb7 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Country2.java
+++ b/wicket-spring/src/main/java/module-info.java
@@ -1,47 +1,32 @@
-/*
- * 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.util.lang;
-
-/**
- * @author jcompagner
- */
-class Country2 extends Country
-{
-
-	private final Country country;
-
-	/**
-	 * Construct.
-	 * 
-	 * @param name
-	 * @param country
-	 */
-	public Country2(String name, Country country)
-	{
-		super(name);
-		this.country = country;
-	}
-
-	/**
-	 * @return Country
-	 */
-	public Country getSubCountry()
-	{
-		return country;
-	}
-
-}
+/*
+ * 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.
+ */
+
+module org.apache.wicket.spring {
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.core;
+    requires org.apache.wicket.ioc;
+    requires javax.inject;
+    requires javax.servlet.api;
+    requires spring.beans;
+    requires spring.context;
+    requires spring.core;
+    requires spring.web;
+
+    exports org.apache.wicket.spring;
+    exports org.apache.wicket.spring.injection.annot;
+    exports org.apache.wicket.spring.test;
+}
diff --git a/wicket-extensions/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java b/wicket-spring/src/test/java/org/apache/wicket/spring/util/license/ApacheLicenceHeaderTest.java
similarity index 91%
rename from wicket-extensions/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
rename to wicket-spring/src/test/java/org/apache/wicket/spring/util/license/ApacheLicenceHeaderTest.java
index 7efc3af..b7fc205 100644
--- a/wicket-extensions/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ b/wicket-spring/src/test/java/org/apache/wicket/spring/util/license/ApacheLicenceHeaderTest.java
@@ -14,7 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.license;
+package org.apache.wicket.spring.util.license;
+
+import org.apache.wicket.util.license.ApacheLicenseHeaderTestCase;
 
 /**
  * Test that the license headers are in place in this project. The tests are run from
diff --git a/wicket-spring/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java b/wicket-spring/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
deleted file mode 100644
index 7efc3af..0000000
--- a/wicket-spring/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ /dev/null
@@ -1,34 +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.util.license;
-
-/**
- * Test that the license headers are in place in this project. The tests are run from
- * {@link ApacheLicenseHeaderTestCase}, but you can add project specific tests here if needed.
- * 
- * @author Frank Bille Jensen (frankbille)
- */
-public class ApacheLicenceHeaderTest extends ApacheLicenseHeaderTestCase
-{
-	/**
-	 * Construct.
-	 */
-	public ApacheLicenceHeaderTest()
-	{
-		// addHeaders = true;
-	}
-}
diff --git a/wicket-util/pom.xml b/wicket-util/pom.xml
index a0c869b..5b8526f 100755
--- a/wicket-util/pom.xml
+++ b/wicket-util/pom.xml
@@ -34,6 +34,7 @@
 	<dependencies>
 		<dependency>
 			<groupId>commons-fileupload</groupId>
+<!--			<groupId>com.jwebmp.jpms.commons</groupId>-->
 			<artifactId>commons-fileupload</artifactId>
 		</dependency>
 		<dependency>
diff --git a/wicket-util/src/main/java/module-info.java b/wicket-util/src/main/java/module-info.java
new file mode 100644
index 0000000..0e4275f
--- /dev/null
+++ b/wicket-util/src/main/java/module-info.java
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+
+module org.apache.wicket.util {
+    requires java.base;
+    requires java.management;
+    requires java.sql;
+    requires java.xml;
+    requires java.desktop;
+    requires org.apache.commons.io;
+    requires org.apache.commons.collections4;
+    requires commons.fileupload;
+    requires org.slf4j;
+    requires javax.servlet.api;
+    requires org.junit.jupiter.api;
+
+    exports org.apache.wicket.util;
+    exports org.apache.wicket.util.collections;
+    exports org.apache.wicket.util.convert;
+    exports org.apache.wicket.util.convert.converter;
+    exports org.apache.wicket.util.crypt;
+    exports org.apache.wicket.util.diff;
+    exports org.apache.wicket.util.diff.myers;
+    exports org.apache.wicket.util.encoding;
+    exports org.apache.wicket.util.file;
+    exports org.apache.wicket.util.io;
+    exports org.apache.wicket.util.lang;
+    exports org.apache.wicket.util.license;
+    exports org.apache.wicket.util.listener;
+    exports org.apache.wicket.util.markup.xhtml;
+    exports org.apache.wicket.util.parse.metapattern;
+    exports org.apache.wicket.util.parse.metapattern.parsers;
+    exports org.apache.wicket.util.resource;
+    exports org.apache.wicket.util.string;
+    exports org.apache.wicket.util.string.interpolator;
+    exports org.apache.wicket.util.thread;
+    exports org.apache.wicket.util.time;
+    exports org.apache.wicket.util.value;
+    exports org.apache.wicket.util.visit;
+    exports org.apache.wicket.util.watch;
+    exports org.apache.wicket.util.xml;
+}
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java b/wicket-velocity/src/main/java/module-info.java
similarity index 77%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java
rename to wicket-velocity/src/main/java/module-info.java
index 3e7d86a..5ec61a0 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java
+++ b/wicket-velocity/src/main/java/module-info.java
@@ -14,15 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.tester.apps_2;
 
-import org.apache.wicket.markup.html.WebPage;
+module org.apache.wicket.velocity {
+    requires javax.servlet.api;
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.core;
+    requires org.slf4j;
+    requires velocity.engine.core;
 
-/**
- * 
- * @author Juergen Donnerstag
- */
-public class LoginPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
+    exports org.apache.wicket.velocity;
 }
diff --git a/wicket-velocity/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java b/wicket-velocity/src/test/java/org/apache/wicket/contrib/util/license/ApacheLicenceHeaderTest.java
similarity index 91%
rename from wicket-velocity/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
rename to wicket-velocity/src/test/java/org/apache/wicket/contrib/util/license/ApacheLicenceHeaderTest.java
index 340000a..30a6c60 100644
--- a/wicket-velocity/src/test/java/org/apache/wicket/util/license/ApacheLicenceHeaderTest.java
+++ b/wicket-velocity/src/test/java/org/apache/wicket/contrib/util/license/ApacheLicenceHeaderTest.java
@@ -14,7 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.util.license;
+package org.apache.wicket.contrib.util.license;
+
+import org.apache.wicket.util.license.ApacheLicenseHeaderTestCase;
 
 /**
  * Test that the license headers are in place in this project. The tests are run from