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/07/18 21:01:09 UTC

[wicket] 01/05: WICKET-6904 Make Apache Wicket fully supporting Java9+ module system

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

mgrigorov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git

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

    WICKET-6904 Make Apache Wicket fully supporting Java9+ module system
    
    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
    
    (cherry picked from commit 9a38f90323a29592ff305b57b4368c12ee823d14)
---
 pom.xml                                            |  60 +-
 testing/wicket-common-tests/pom.xml                |   1 -
 .../wicket/osgi/OsgiClashingPackagesTest.java      |  13 +-
 testing/wicket-js-tests/pom.xml                    |   1 -
 wicket-auth-roles/pom.xml                          |   4 -
 .../src/main/java/module-info.java                 |  35 +-
 .../util/license/ApacheLicenceHeaderTest.java      |   4 +-
 .../util/markup/xhtml/WellFormedXmlTest.java       |  69 +-
 wicket-bean-validation/pom.xml                     |  22 +-
 .../src/main/java/module-info.java                 |  16 +-
 .../validation/BeanValidationConfiguration.java    |  16 +
 .../bean/validation/BeanValidationContext.java     |  16 +
 .../wicket/bean/validation/ConstraintIterator.java |  16 +
 .../bean/validation/DefaultPropertyResolver.java   |  16 +
 .../bean/validation/DefaultValidatorProvider.java  |  16 +
 .../validation/DefaultViolationTranslator.java     |  16 +
 .../apache/wicket/bean/validation/GroupsModel.java |  16 +
 .../wicket/bean/validation/IPropertyResolver.java  |  16 +
 .../wicket/bean/validation/ITagModifier.java       |  16 +
 .../bean/validation/IViolationTranslator.java      |  16 +
 .../apache/wicket/bean/validation/Property.java    |  16 +
 .../wicket/bean/validation/PropertyValidator.java  |  16 +
 .../bean/validation/PropertyValidator.properties   |  14 +
 .../bean/validation/SessionLocaleInterpolator.java |  16 +
 .../wicket/bean/validation/SizeTagModifier.java    |  16 +
 .../bean/validation/ValidationModelResolver.java   |  16 +
 .../validation/PropertyValidatorRequiredTest.java  |  16 +
 .../bean/validation/TestValidatableBean.java       |  16 +
 .../validation/ValidationModelResolverTest.java    |  18 +-
 .../util/license/ApacheLicenceHeaderTest.java      |   4 +-
 .../util/markup/xhtml/WellFormedXmlTest.java       |  69 +-
 wicket-cdi/pom.xml                                 |   4 -
 .../src/main/java/module-info.java                 |  33 +-
 wicket-core/pom.xml                                |   4 -
 wicket-core/src/main/java/module-info.java         | 141 ++++
 .../wicket/request/resource/AbstractResource.java  |   3 +-
 .../wicket/{ => core}/request/resource/sample.js   |   0
 .../ajax/form/AjaxFormSubmitBehaviorTest.java      |   4 +-
 ...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 +-
 .../{ => core}/request/cycle/RerenderAjaxPage.html |   0
 .../{ => core}/request/cycle/RerenderAjaxPage.java |   2 +-
 .../{ => core}/request/cycle/RerenderPage.html     |   0
 .../{ => core}/request/cycle/RerenderPage.java     |   2 +-
 .../{ => core}/request/cycle/RerenderPageTest.java |   5 +-
 .../{ => core}/request/cycle/UrlRendererTest.java  |   2 +-
 .../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 +-
 .../request/mapper/CustomHomePageTest.java         |   2 +-
 .../request/mapper/info/ComponentInfoTest.java     |   3 +-
 .../request/mapper/info/PageComponentInfoTest.java |   3 +-
 .../{ => core}/request/resource/BundlesPage.html   |   0
 .../{ => core}/request/resource/BundlesPage.java   |   3 +-
 .../request/resource/BundlesPage_ext_result.html   |   0
 .../request/resource/BundlesPage_result.html       |   2 +-
 .../request/resource/BundlesPage_result_defer.html |   2 +-
 .../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        |  15 +-
 .../MetaInfStaticResourceReferenceTest.java        | 240 +++----
 .../MinifiedAwareResourceReferenceTest.java        |   4 +-
 .../resource/PackageResourceReferenceTest.java     | 780 +++++++++++----------
 .../request/resource/ResouceBundleTest.java        |   8 +-
 .../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 ++--
 .../wicket/{ => core}/request/resource/a.css       |   0
 .../apache/wicket/{ => core}/request/resource/a.js |   0
 .../wicket/{ => core}/request/resource/b.css       |   0
 .../apache/wicket/{ => core}/request/resource/b.js |   0
 .../wicket/{ => core}/request/resource/b.min.css   |   0
 .../wicket/{ => core}/request/resource/b.min.js    |   0
 .../wicket/{ => core}/request/resource/b_de.js     |   0
 .../wicket/{ => core}/request/resource/b_nl.js     |   0
 .../wicket/{ => core}/request/resource/b_nl.min.js |   0
 .../wicket/{ => core}/request/resource/b_nl_BE.js  |   0
 .../{ => core}/request/resource/b_nl_BE.min.js     |   0
 .../wicket/{ => core}/request/resource/b_style.js  |   0
 .../{ => core}/request/resource/b_style.min.js     |   0
 .../{ => core}/request/resource/b_style_nl.js      |   0
 .../{ => core}/request/resource/b_style_nl.min.js  |   0
 .../{ => core}/request/resource/b_style_nl_BE.js   |   0
 .../request/resource/b_style_nl_BE.min.js          |   0
 .../{ => core}/request/resource/b_var_style.js     |   0
 .../{ => core}/request/resource/b_var_style.min.js |   0
 .../{ => core}/request/resource/b_var_style_nl.js  |   0
 .../request/resource/b_var_style_nl.min.js         |   0
 .../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 +-
 .../{ => core}/request/resource/resource.txt       |   0
 .../{ => core}/request/resource/resource_en.txt    |   0
 .../{ => core}/request/resource/resource_en_US.txt |   0
 .../request/resource/resource_gt_4096.txt          |   0
 .../{ => core}/request/resource/resource_style.txt |   0
 .../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
 .../{ => core}/request/resource/resource_var.txt   |   0
 .../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
 .../wicket/{ => core}/util/ExceptionTestBase.java  |   2 +-
 .../wicket/{ => core}/util/Log4jEventHistory.java  | 148 ++--
 .../{ => core}/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/file/WebApplicationPathTest.java          |   3 +-
 .../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/markup/xhtml/WellFormedXmlTest.java       |  69 +-
 .../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/template/CssTemplateTest.java  |   4 +-
 .../util/tester/BlockedResourceLinkPage.html       |   0
 .../util/tester/BlockedResourceLinkPage.java       |   2 +-
 .../wicket/{ => core}/util/tester/CookiePage.java  |   3 +-
 .../tester/FormTesterSubmitLinkTest$TestPage.html  |   0
 .../util/tester/FormTesterSubmitLinkTest.java      |   5 +-
 .../{ => core}/util/tester/FormTesterTest.java     |  18 +-
 .../{ => core}/util/tester/MockAjaxFormPage.html   |   0
 .../{ => core}/util/tester/MockAjaxFormPage.java   |   2 +-
 .../util/tester/MockFormFileUploadPage.html        |   0
 .../util/tester/MockFormFileUploadPage.java        |   2 +-
 .../{ => core}/util/tester/MockFormPage.html       |   0
 .../{ => core}/util/tester/MockFormPage.java       |   2 +-
 .../util/tester/MockFormSubmitsPage.html           |   0
 .../util/tester/MockFormSubmitsPage.java           |   2 +-
 .../MockPageAjaxSubmitLinkSubmitsWholeForm.html    |   0
 .../MockPageAjaxSubmitLinkSubmitsWholeForm.java    |   2 +-
 .../MockPageParameterPage$MockInnerClassPage.html  |   0
 .../util/tester/MockPageParameterPage.html         |   0
 .../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/tester/MockResourceLinkPage.html          |   0
 .../util/tester/MockResourceLinkPage.java          |   2 +-
 .../{ => core}/util/tester/NestedFormPage.html     |   0
 .../{ => core}/util/tester/NestedFormPage.java     |   2 +-
 .../StartComponentInPageRedirectToRenderTest.java  |   3 +-
 .../{ => core}/util/tester/TagTesterTest.java      |   5 +-
 .../tester/WicketTesterClickExternalLinkTest.java  |   3 +-
 .../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 +-
 .../{ => core}/util/tester/WicketTesterTest.java   |  29 +-
 .../wicket/{ => core}/util/tester/apps_1/Book.java |   2 +-
 .../{ => core}/util/tester/apps_1/CreateBook.html  |   0
 .../{ => core}/util/tester/apps_1/CreateBook.java  |   2 +-
 .../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
 .../{ => core}/util/tester/apps_1/SuccessPage.html |   0
 .../{ => core}/util/tester/apps_1/SuccessPage.java |   2 +-
 .../{ => core}/util/tester/apps_1/ViewBook.html    |   0
 .../{ => core}/util/tester/apps_1/ViewBook.java    |   2 +-
 .../{ => core}/util/tester/apps_2/LoginPage.html   |   0
 .../{ => core}/util/tester/apps_2/LoginPage.java   |   2 +-
 .../util/tester/apps_2/RedirectPage.html           |   0
 .../util/tester/apps_2/RedirectPage.java           |   2 +-
 .../wicket/{ => core}/util/tester/apps_2/Test.java |   2 +-
 .../{ => core}/util/tester/apps_3/ChoicePage.html  |   0
 .../{ => core}/util/tester/apps_3/ChoicePage.java  |   4 +-
 .../util/tester/apps_3/FormTesterTest.java         |   4 +-
 .../{ => core}/util/tester/apps_4/EmailPage.html   |   0
 .../{ => core}/util/tester/apps_4/EmailPage.java   |   2 +-
 .../util/tester/apps_4/EmailPage.properties        |   0
 .../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/tester/apps_5/MockPageWithLink.html       |   0
 .../util/tester/apps_5/MockPageWithLink.java       |   2 +-
 .../{ => core}/util/tester/apps_6/LinkPage.html    |   0
 .../{ => core}/util/tester/apps_6/LinkPage.java    | 266 +++----
 .../{ => core}/util/tester/apps_6/ResultPage.html  |   0
 .../{ => core}/util/tester/apps_6/ResultPage.java  |  98 +--
 .../{ => core}/util/tester/apps_7/HomePage.html    |  12 +-
 .../{ => core}/util/tester/apps_7/HomePage.java    |   2 +-
 .../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
 .../apache/wicket/{ => core}/util/tester/bg.jpg    | Bin
 .../cookies/CollectAllRequestCookiesPage.java      |   2 +-
 .../{ => core}/util/tester/cookies/EndPage.java    |   2 +-
 .../util/tester/cookies/SetCookiePage.java         |   2 +-
 .../apache/wicket/{ => core}/util/tester/test.html |   0
 .../InvalidResourceSpecificationExceptionTest.java |   2 +-
 wicket-devutils/pom.xml                            |   4 -
 .../src/main/java/module-info.java                 |  36 +-
 .../util/license/ApacheLicenceHeaderTest.java      |   4 +-
 .../util/markup/xhtml/WellFormedXmlTest.java       |  69 +-
 wicket-experimental/wicket-metrics/pom.xml         |   4 -
 .../wicket-metrics/src/main/java/module-info.java  |  53 +-
 wicket-extensions/pom.xml                          |   4 -
 wicket-extensions/src/main/java/module-info.java   |  74 ++
 .../util/license/ApacheLicenceHeaderTest.java      |   3 +-
 .../util/markup/xhtml/WellFormedXmlTest.java       |  69 +-
 wicket-guice/pom.xml                               |   4 -
 .../src/main/java/module-info.java                 |  19 +-
 .../util/license/ApacheLicenceHeaderTest.java      |  71 +-
 wicket-ioc/pom.xml                                 |   4 -
 .../src/main/java/module-info.java                 |  19 +-
 .../util/license/ApacheLicenceHeaderTest.java      |   3 +-
 wicket-jmx/pom.xml                                 |   4 -
 .../src/main/java/module-info.java                 |  32 +-
 .../jmx}/util/license/ApacheLicenceHeaderTest.java |   3 +-
 .../util/license/ApacheLicenceHeaderTest.java      |  34 -
 .../wicket-native-websocket-core/pom.xml           |   4 -
 .../src/main/java/module-info.java                 |  37 +-
 .../wicket-native-websocket-javax/pom.xml          |   4 -
 .../src/main/java/module-info.java                 |  32 +-
 wicket-objectsizeof-agent/pom.xml                  |   4 -
 .../src/main/java/module-info.java                 |  16 +-
 .../src/main/java/module-info.java                 |  47 +-
 .../src/main/java/module-info.java                 |  36 +-
 .../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                 |  18 +-
 .../util/license/ApacheLicenceHeaderTest.java      |   4 +-
 320 files changed, 3680 insertions(+), 3250 deletions(-)

diff --git a/pom.xml b/pom.xml
index 900a73a..120f597 100644
--- a/pom.xml
+++ b/pom.xml
@@ -159,8 +159,8 @@
 		<jakarta.websocket-api.version>2.0.0</jakarta.websocket-api.version>
 		<jakarta.servlet-api.version>5.0.0</jakarta.servlet-api.version>
 		<jdk-serializable-functional.version>1.9.0</jdk-serializable-functional.version>
-		<jetty.version>11.0.4</jetty.version>
-		<junit.version>5.7.2</junit.version>
+		<jetty.version>11.0.6</jetty.version>
+		<junit.version>5.8.0-M1</junit.version>
 		<jsr305.version>3.0.2</jsr305.version>
 		<logback.version>1.2.3</logback.version>
 		<hamcrest.version>2.2</hamcrest.version>
@@ -170,7 +170,7 @@
 		<mockito.version>3.11.2</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-alpha2</slf4j.version>
 		<spring.version>5.3.8</spring.version>
 		<wagon-ssh-external.version>3.4.3</wagon-ssh-external.version>
 		<weld.version>4.0.1.SP1</weld.version>
@@ -199,7 +199,6 @@
 		<maven-war-plugin.version>3.3.1</maven-war-plugin.version>
 		<yuicompressor-maven-plugin.version>1.5.1</yuicompressor-maven-plugin.version>
 
-		<automatic-module-name>MUST-BE-OVERRIDDEN-BY-MODULES</automatic-module-name>
 	</properties>
 
 	<dependencyManagement>
@@ -991,9 +990,6 @@
 								<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
 								<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
 							</manifest>
-							<manifestEntries>
-								<Automatic-Module-Name>${automatic-module-name}</Automatic-Module-Name>
-							</manifestEntries>
 						</archive>
 					</configuration>
 				</plugin>
@@ -1012,9 +1008,7 @@
 						<failOnError>false</failOnError>
 						<doclint>none</doclint>
 						<additionalJOption>${javadoc.additionalJOption}</additionalJOption>
-						<sourcepath>${project.build.sourceDirectory}</sourcepath>
-						<!-- While we publish modules, our source is pre-JMPS so tell javadoc that. -->
-						<source>8</source>
+						<source>${java.specification.version}</source>
 					</configuration>
 					<executions>
 						<execution>
@@ -1092,6 +1086,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>
@@ -1297,12 +1292,6 @@
 			<!-- distribution management is inherited from the parent pom -->
 		</profile>
 		<profile>
-			<id>all</id>
-			<activation>
-				<activeByDefault>true</activeByDefault>
-			</activation>
-		</profile>
-		<profile>
 			<id>fast</id>
 			<build>
 				<plugins>
@@ -1361,45 +1350,6 @@
 			</build>
 		</profile>
 		<profile>
-			<id>Java 11</id>
-			<activation>
-				<jdk>11</jdk>
-			</activation>
-			<properties>
-				<!-- Disable javadoc linter when building with Java 8
-				 http://mail-archives.apache.org/mod_mbox/maven-users/201403.mbox/%3CCANWgJS5xHWiGE+Lecey+mZVbj9Via4JUWsaBeZtQr2aQNebupA@mail.gmail.com%3E
-				 http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html
-				 -->
-				<additionalparam>-Xdoclint:none</additionalparam>
-			</properties>
-		</profile>
-		<profile>
-			<id>buildbot</id>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>org.apache.maven.plugins</groupId>
-						<artifactId>maven-toolchains-plugin</artifactId>
-						<version>${maven-toolchains-plugin.version}</version>
-						<executions>
-							<execution>
-								<goals>
-									<goal>toolchain</goal>
-								</goals>
-							</execution>
-						</executions>
-						<configuration>
-							<toolchains>
-								<jdk>
-									<version>${maven.compiler.source}</version>
-								</jdk>
-							</toolchains>
-						</configuration>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-		<profile>
 			<id>java12</id>
 			<build>
 				<plugins>
diff --git a/testing/wicket-common-tests/pom.xml b/testing/wicket-common-tests/pom.xml
index a66c0f4..7814ad1 100644
--- a/testing/wicket-common-tests/pom.xml
+++ b/testing/wicket-common-tests/pom.xml
@@ -29,7 +29,6 @@
 	<description>Tests for all Wicket modules</description>
 
 	<properties>
-		<automatic-module-name>org.apache.wicket.common.tests</automatic-module-name>
 		<clirr.skip>true</clirr.skip>
 	</properties>
 
diff --git a/testing/wicket-common-tests/src/test/java/org/apache/wicket/osgi/OsgiClashingPackagesTest.java b/testing/wicket-common-tests/src/test/java/org/apache/wicket/osgi/OsgiClashingPackagesTest.java
index b7670d0..3af34dd 100644
--- a/testing/wicket-common-tests/src/test/java/org/apache/wicket/osgi/OsgiClashingPackagesTest.java
+++ b/testing/wicket-common-tests/src/test/java/org/apache/wicket/osgi/OsgiClashingPackagesTest.java
@@ -23,11 +23,11 @@ import org.junit.jupiter.api.Test;
  *
  * Based on https://gist.github.com/1977817, contributed by Andreas Pieber
  */
-public class OsgiClashingPackagesTest
+class OsgiClashingPackagesTest
 {
 
 	@Test
-	public void collectProjectPackages() throws IOException
+	void collectProjectPackages() throws IOException
 	{
 		char pathSeparator = System.getProperty("path.separator").charAt(0);
 		String classpath = System.getProperty("java.class.path");
@@ -118,11 +118,14 @@ public class OsgiClashingPackagesTest
 		{
 			for (String packageWithContent : packagesWithContent)
 			{
-				if (!projectBuckets.containsKey(packageWithContent))
+				if (!"".equals(packageWithContent))
 				{
-					projectBuckets.put(packageWithContent, new ArrayList<>());
+					if (!projectBuckets.containsKey(packageWithContent))
+					{
+						projectBuckets.put(packageWithContent, new ArrayList<>());
+					}
+					projectBuckets.get(packageWithContent).add(this);
 				}
-				projectBuckets.get(packageWithContent).add(this);
 			}
 		}
 
diff --git a/testing/wicket-js-tests/pom.xml b/testing/wicket-js-tests/pom.xml
index 4c283bf..198256b 100644
--- a/testing/wicket-js-tests/pom.xml
+++ b/testing/wicket-js-tests/pom.xml
@@ -29,7 +29,6 @@
 	<description>JavaScript tests for all Wicket modules</description>
 
 	<properties>
-		<automatic-module-name>org.apache.wicket.js.tests</automatic-module-name>
 		<clirr.skip>true</clirr.skip>
 	</properties>
 
diff --git a/wicket-auth-roles/pom.xml b/wicket-auth-roles/pom.xml
index a7331cb..15f3c7e 100644
--- a/wicket-auth-roles/pom.xml
+++ b/wicket-auth-roles/pom.xml
@@ -31,10 +31,6 @@
 		annotations.
 	</description>
 
-	<properties>
-		<automatic-module-name>org.apache.wicket.auth.roles</automatic-module-name>
-	</properties>
-
 	<dependencies>
 		<dependency>
 			<groupId>org.apache.wicket</groupId>
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage.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/resource/BundlesPage.java
copy to wicket-auth-roles/src/main/java/module-info.java
index 74d4084..78fe988 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage.java
+++ b/wicket-auth-roles/src/main/java/module-info.java
@@ -14,30 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
 
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
-import org.apache.wicket.markup.html.WebPage;
+module org.apache.wicket.auth.roles {
+    requires java.base;
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.request;
+    requires org.apache.wicket.core;
 
-/**
- * @author papegaaij
- */
-public class BundlesPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Construct.
-	 */
-	public BundlesPage()
-	{
-	}
-
-	@Override
-	public void renderHead(IHeaderResponse response)
-	{
-		response.render(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(
-			ResouceBundleTest.class, "a.js")));
-	}
+    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-bean-validation/pom.xml b/wicket-bean-validation/pom.xml
index 7087f99..615c5f7 100644
--- a/wicket-bean-validation/pom.xml
+++ b/wicket-bean-validation/pom.xml
@@ -1,4 +1,20 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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.
+-->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
@@ -11,10 +27,6 @@
 	<packaging>bundle</packaging>
 	<name>Wicket Bean Validation</name>
 
-	<properties>
-		<automatic-module-name>org.apache.wicket.bean.validation</automatic-module-name>
-	</properties>
-
 	<dependencies>
 		<dependency>
 			<groupId>jakarta.el</groupId>
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.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/lang/Person2.java
copy to wicket-bean-validation/src/main/java/module-info.java
index fcfc1c5..ce46fc1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Person2.java
+++ b/wicket-bean-validation/src/main/java/module-info.java
@@ -14,17 +14,11 @@
  * 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.bean.validation {
+    requires org.apache.wicket.util;
+    requires org.apache.wicket.core;
+    requires java.validation;
 
-	@Override
-	public String getName()
-	{
-		return (String)super.getName();
-	}
+    exports org.apache.wicket.bean.validation;
 }
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/BeanValidationConfiguration.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/BeanValidationConfiguration.java
index 747643c..7738ef1 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/BeanValidationConfiguration.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/BeanValidationConfiguration.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import java.lang.annotation.Annotation;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/BeanValidationContext.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/BeanValidationContext.java
index 77541ab..f3293c5 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/BeanValidationContext.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/BeanValidationContext.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import java.lang.annotation.Annotation;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ConstraintIterator.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ConstraintIterator.java
index 860dad1..e78d9ae 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ConstraintIterator.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ConstraintIterator.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import java.util.ArrayList;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java
index 4409208..3f1d612 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import org.apache.wicket.WicketRuntimeException;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultValidatorProvider.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultValidatorProvider.java
index 6b832a2..a805918 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultValidatorProvider.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultValidatorProvider.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import java.util.function.Supplier;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultViolationTranslator.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultViolationTranslator.java
index 0a2eec4..742138d 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultViolationTranslator.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultViolationTranslator.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import java.util.ArrayList;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/GroupsModel.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/GroupsModel.java
index ff97980..24337f9 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/GroupsModel.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/GroupsModel.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import java.util.ArrayList;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IPropertyResolver.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IPropertyResolver.java
index bcfd7ef..be238b4 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IPropertyResolver.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IPropertyResolver.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import org.apache.wicket.markup.html.form.FormComponent;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ITagModifier.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ITagModifier.java
index 958d9d6..70d0f55 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ITagModifier.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ITagModifier.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import java.lang.annotation.Annotation;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IViolationTranslator.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IViolationTranslator.java
index 39d4f95..8e9ae8f 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IViolationTranslator.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/IViolationTranslator.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import jakarta.validation.ConstraintViolation;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/Property.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/Property.java
index cabe799..b411f17 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/Property.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/Property.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import java.io.Serializable;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java
index ba40075..c696c7d 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import java.util.Arrays;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.properties b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.properties
index 2532ac3..b430495 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.properties
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.properties
@@ -1,3 +1,17 @@
+#  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.
 jakarta.validation.constraints.AssertFalse.message        = '${label}' must be false
 jakarta.validation.constraints.AssertTrue.message         = '${label}' must be true
 jakarta.validation.constraints.DecimalMax.message         = '${label}' must be less than or equal to ${value}
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/SessionLocaleInterpolator.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/SessionLocaleInterpolator.java
index 13ce537..58d7473 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/SessionLocaleInterpolator.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/SessionLocaleInterpolator.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import java.util.Locale;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/SizeTagModifier.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/SizeTagModifier.java
index 003bd18..0fc3f64 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/SizeTagModifier.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/SizeTagModifier.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import jakarta.validation.constraints.Size;
diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java
index a429c43..7d260da 100644
--- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java
+++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import org.apache.wicket.markup.html.form.FormComponent;
diff --git a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/PropertyValidatorRequiredTest.java b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/PropertyValidatorRequiredTest.java
index 5369724..af00794 100644
--- a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/PropertyValidatorRequiredTest.java
+++ b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/PropertyValidatorRequiredTest.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import org.apache.wicket.MarkupContainer;
diff --git a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/TestValidatableBean.java b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/TestValidatableBean.java
index a24456f..eebf914 100644
--- a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/TestValidatableBean.java
+++ b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/TestValidatableBean.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import jakarta.validation.constraints.NotNull;
diff --git a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java
index a174ed4..2c390f4 100644
--- a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java
+++ b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java
@@ -1,3 +1,19 @@
+/*
+ * 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;
 
 import org.apache.wicket.markup.html.form.TextField;
@@ -44,4 +60,4 @@ public class ValidationModelResolverTest
         assertEquals("text", model.getPropertyField().getName());
     }
 
-}
\ No newline at end of file
+}
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-devutils/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-devutils/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-devutils/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-cdi/pom.xml b/wicket-cdi/pom.xml
index 715e07a..e149481 100644
--- a/wicket-cdi/pom.xml
+++ b/wicket-cdi/pom.xml
@@ -33,10 +33,6 @@
 		and resources.
 	</description>
 
-	<properties>
-		<automatic-module-name>org.apache.wicket.cdi</automatic-module-name>
-	</properties>
-
 	<dependencies>
 		<dependency>
 			<groupId>jakarta.annotation</groupId>
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/lang/Country.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/Country.java
copy to wicket-cdi/src/main/java/module-info.java
index 561af07..3db04a1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/lang/Country.java
+++ b/wicket-cdi/src/main/java/module-info.java
@@ -14,29 +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 Country
-{
-	private final String name;
-
-	/**
-	 * @param name
-	 */
-	public Country(String name)
-	{
-		this.name = name;
-	}
+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;
 
-	/**
-	 * @return The name
-	 */
-	public String getName()
-	{
-		return name;
-	}
+    exports org.apache.wicket.cdi;
 }
diff --git a/wicket-core/pom.xml b/wicket-core/pom.xml
index 18268bd..d164eca 100644
--- a/wicket-core/pom.xml
+++ b/wicket-core/pom.xml
@@ -36,10 +36,6 @@
 		persisted using your favorite technology.
 	</description>
 
-	<properties>
-		<automatic-module-name>org.apache.wicket.core</automatic-module-name>
-	</properties>
-
 	<dependencies>
 		<dependency>
 			<groupId>org.hamcrest</groupId>
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..9c6dc2a
--- /dev/null
+++ b/wicket-core/src/main/java/module-info.java
@@ -0,0 +1,141 @@
+/*
+ * 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.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 jakarta.servlet;
+    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 c249b2b..a9ff5a8 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/META-INF/resources/org/apache/wicket/request/resource/sample.js b/wicket-core/src/test/java/META-INF/resources/org/apache/wicket/core/request/resource/sample.js
similarity index 100%
rename from wicket-core/src/test/java/META-INF/resources/org/apache/wicket/request/resource/sample.js
rename to wicket-core/src/test/java/META-INF/resources/org/apache/wicket/core/request/resource/sample.js
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..70854f3 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.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/cycle/MultiRequestCycleListenerCallOrderApplication.java b/wicket-core/src/test/java/org/apache/wicket/core/request/cycle/MultiRequestCycleListenerCallOrderApplication.java
similarity index 95%
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/cycle/MultiRequestCycleListenerCallOrderApplication.java
index aa057e7..a7a699d 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/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.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/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/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/cycle/MultiRequestCycleListenerCallOrderPage.java
similarity index 97%
copy from wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderPage.java
copy to wicket-core/src/test/java/org/apache/wicket/core/request/cycle/MultiRequestCycleListenerCallOrderPage.java
index 065caab..75fc867 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/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.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/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/cycle/MultiRequestCycleListenerCallOrderTest.java
index f0b5723..9d530f2 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/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.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/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/cycle/PageRequestHandlerTrackerTest.java
index ce684c5..e023932 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/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.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/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/cycle/RequestCycleListenerDetachOrderTest.java
index 70e82f7..17d3647 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/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.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/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/cycle/RequestCycleListenerTest.java
index caa89f9..2700395 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/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.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/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/cycle/RequestCycleUrlForTest.java
index 2602643..413164e 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/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.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/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/cycle/RequestHandlerExecutorTest.java
index eb42129..1cdd45e 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/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.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/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/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/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/cycle/RerenderAjaxPage.java
index 928fc34..01501da 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/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.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/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/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/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/cycle/RerenderPage.java
index 6adba97..e9de1ce 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/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.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/cycle/RerenderPageTest.java
similarity index 96%
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/cycle/RerenderPageTest.java
index 98d7a4c..f2a3170 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/cycle/RerenderPageTest.java
@@ -14,14 +14,13 @@
  * 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.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.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
@@ -54,7 +53,7 @@ class RerenderPageTest extends WicketTestCase
 		tester.assertContains("<!-- I should be present 1 -->");
 
 		// add a supplier to modify the URL during render
-		page.setNewValueHandler(new Supplier<Integer>()
+		page.setNewValueHandler(new RerenderPage.Supplier<Integer>()
 		{
 			private static final long serialVersionUID = 1L;
 
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/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/cycle/UrlRendererTest.java
index b7df849..ce244a9 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/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.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/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%
rename from wicket-core/src/test/java/org/apache/wicket/request/handler/render/AbstractVariations.java
rename 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%
copy from wicket-core/src/test/java/org/apache/wicket/request/handler/render/Variation.java
copy 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 cd4887c..bb8cc80 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..7eae474 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.tester.WicketTesterLazyIsPageStatelessRedirectToBufferTest.EmptyPage;
 import org.junit.jupiter.api.Test;
 
 /**
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/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/mapper/CustomHomePageTest.java
index ecdefe4..94137a9 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/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.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/mapper/info/ComponentInfoTest.java
similarity index 97%
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/mapper/info/ComponentInfoTest.java
index 21df52e..60f2fe9 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/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.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/mapper/info/PageComponentInfoTest.java
similarity index 95%
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/mapper/info/PageComponentInfoTest.java
index a657b88..3802f7d 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/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.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/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/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/resource/BundlesPage.java
similarity index 91%
copy from wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage.java
copy to wicket-core/src/test/java/org/apache/wicket/core/request/resource/BundlesPage.java
index 74d4084..88d07bb 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/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.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/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/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/resource/BundlesPage_result.html
similarity index 56%
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/resource/BundlesPage_result.html
index 02caf0a..345aaf1 100644
--- 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/resource/BundlesPage_result.html
@@ -1,5 +1,5 @@
 <html>
-<head><script type="text/javascript" src="../resource/org.apache.wicket.request.resource.ResouceBundleTest/ab.js"></script>
+<head><script type="text/javascript" src="../resource/org.apache.wicket.core.request.resource.ResouceBundleTest/ab.js"></script>
 </head><body>
 
 </body>
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/resource/BundlesPage_result_defer.html
similarity index 52%
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/resource/BundlesPage_result_defer.html
index ebaf99e..995a44c 100644
--- 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/resource/BundlesPage_result_defer.html
@@ -1,5 +1,5 @@
 <html>
-<head><script type="text/javascript" defer="defer" src="../resource/org.apache.wicket.request.resource.ResouceBundleTest/ab.js"></script>
+<head><script type="text/javascript" defer="defer" src="../resource/org.apache.wicket.core.request.resource.ResouceBundleTest/ab.js"></script>
 </head><body>
 
 </body>
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/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/resource/ByteArrayResourceTest.java
index 838aff9..aaf2494 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/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.resource;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.eq;
@@ -26,6 +26,7 @@ import jakarta.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/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/resource/CharSequenceResourceTest.java
index 340597d..23404aa 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/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.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/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/resource/ContextRelativeResourceReferenceTest.java
index 2153310..b4bb670 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/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.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/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/resource/CssPackageResourceTest.java
index 7820e4c..5038afd 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/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.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/resource/DynamicImageResourceTest.java
similarity index 95%
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/resource/DynamicImageResourceTest.java
index 37103f2..da8ab1a 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/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.resource;
 
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import jakarta.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/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/resource/JavaScriptPackageResourceTest.java
index 14a63cb..a0b4e13 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/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.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/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/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/resource/LessResourceReferenceTest.java
similarity index 88%
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/resource/LessResourceReferenceTest.java
index 7e4b6d5..56146d4 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/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.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;
@@ -41,7 +46,7 @@ import org.junit.jupiter.api.Test;
  *
  * @since 1.5.9
  */
-public class LessResourceReferenceTest extends WicketTestCase
+class LessResourceReferenceTest extends WicketTestCase
 {
 	private static final AtomicBoolean PROCESS_RESPONSE_CALLED = new AtomicBoolean(false);
 
@@ -128,8 +133,8 @@ public class LessResourceReferenceTest extends WicketTestCase
 	void processLessResourcesWithoutStartingAPage()
 	{
 		// make a request to the resource that is not registered in the ResourceReferenceRegistry
-		CharSequence urlToReference = "./wicket/resource/org.apache.wicket.request.resource.LessResourceReferenceTest/LessResourceReference.less";
-		tester.executeUrl(urlToReference.toString());
+		String urlToReference = "./wicket/resource/org.apache.wicket.core.request.resource.LessResourceReferenceTest/LessResourceReference.less";
+		tester.executeUrl(urlToReference);
 		assertTrue(PROCESS_RESPONSE_CALLED.get());
 	}
 
@@ -146,7 +151,7 @@ public class LessResourceReferenceTest extends WicketTestCase
 
 		public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass)
 		{
-			return new StringResourceStream("<html/>");
+			return new StringResourceStream("<html><head></head><body></body></html>");
 		}
 	}
 
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/resource/MetaInfStaticResourceReferenceTest.java
similarity index 90%
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/resource/MetaInfStaticResourceReferenceTest.java
index 135e42f..e300cb4 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/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.resource;
+
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+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);
+		assertNotEquals(metaUrl, 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/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/resource/MinifiedAwareResourceReferenceTest.java
index 7bec622..1b5afb1 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/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.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/resource/PackageResourceReferenceTest.java
similarity index 90%
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/resource/PackageResourceReferenceTest.java
index 426ee24..bf8cd88 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/resource/PackageResourceReferenceTest.java
@@ -1,381 +1,399 @@
-/*
- * 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.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 final Locale[] locales = { null, new Locale("en"), new Locale("en", "US") };
+	private static final String[] styles = { null, "style" };
+	private static final String[] variations = { null, "var" };
+
+	/**
+	 * @throws Exception
+	 */
+	@BeforeEach
+	void before()
+	{
+		// 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 = PackageResourceReferenceTest.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), 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/resource/ResouceBundleTest.java
similarity index 93%
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/resource/ResouceBundleTest.java
index 9b5b85c..86bb258 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/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.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;
@@ -43,7 +47,7 @@ import org.junit.jupiter.api.Test;
  * 
  * @author papegaaij
  */
-public class ResouceBundleTest extends WicketTestCase
+class ResouceBundleTest extends WicketTestCase
 {
 	@BeforeEach
 	void before()
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/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/resource/ResourceReferenceLambdaTest.java
index a31d65f..bd49e75 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/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.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/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/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/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/resource/ResourceReferenceLocatingTest.java
index e36243b..7143170 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/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.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/resource/ResourceReferenceRegistryTest.java
similarity index 79%
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/resource/ResourceReferenceRegistryTest.java
index ca4c0b5..562dc40 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/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.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/resource/UrlResourceReferenceTest.java
similarity index 97%
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/resource/UrlResourceReferenceTest.java
index 81b6554..49fb4e5 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/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.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/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/resource/WriteCallbackTest.java
index 1dba5f6..f6e1966 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/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.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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/resource/caching/ContextRelativeResourceCachingTest.java
index 8e9544e..ee3aab3 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/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.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/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/resource/caching/FilenameWithVersionResourceCachingStrategyTest.java
index 21f807f..d2c8d80 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/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.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/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/resource/caching/QueryStringWithVersionResourceCachingStrategyTest.java
index c0268d0..d5d0ada 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/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.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/resource/caching/TestResource.java
similarity index 87%
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/resource/caching/TestResource.java
index e21b6aa..de98a1b 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/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.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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/resource/resource_var_style_en_US.txt
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/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/ExceptionTestBase.java
index 05d2203..d07375e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/ExceptionTestBase.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/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;
 
 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/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/Log4jEventHistory.java
index 8d87ea9..e7939ac 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/Log4jEventHistory.java
+++ b/wicket-core/src/test/java/org/apache/wicket/core/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;
+
+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/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/cookies/CookieUtilsTest.java
index 7739ace..3f1cdbd 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/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 jakarta.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.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 jakarta.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/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/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/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/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/cookies/CookieValuePersisterTestPage.java
index 9144162..f62f939 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/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.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/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/cookies/PreserveRequestCookieAfterLinkClickTest.java
index 42e5667..9ffd4e5 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/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.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/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/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/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/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/cookies/SetCookieAndRedirectStatefullTestPage.java
index 0af469b..1eb316f 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/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.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/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/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/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/cookies/SetCookieAndRedirectStatelessTestPage.java
similarity index 95%
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/cookies/SetCookieAndRedirectStatelessTestPage.java
index 665bd9d..57ed2ad 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/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.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/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/cookies/SetCookieAndRedirectTest.java
index eed831d..8fd31c3 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/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 jakarta.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.cookies;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.List;
+import jakarta.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/file/WebApplicationPathTest.java
similarity index 94%
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/file/WebApplicationPathTest.java
index 9ed3fcb..d8badb3 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/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.file;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -22,7 +22,6 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 import java.net.URL;
 import jakarta.servlet.ServletContext;
 
-import org.apache.wicket.core.util.file.WebApplicationPath;
 import org.apache.wicket.util.resource.IResourceStream;
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentMatchers;
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%
copy from wicket-core/src/test/java/org/apache/wicket/util/lang/Country.java
copy 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%
rename from wicket-core/src/test/java/org/apache/wicket/util/lang/Country2.java
rename 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/util/markup/xhtml/WellFormedXmlTest.java b/wicket-core/src/test/java/org/apache/wicket/core/util/markup/xhtml/WellFormedXmlTest.java
similarity index 90%
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/markup/xhtml/WellFormedXmlTest.java
index 26cfc9d..fe2b182 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/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.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/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/template/CssTemplateTest.java b/wicket-core/src/test/java/org/apache/wicket/core/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/template/CssTemplateTest.java
index f60cc77..0454409 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/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.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/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/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/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/tester/BlockedResourceLinkPage.java
index aa12d73..ed80c61 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/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.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/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/tester/CookiePage.java
index 574c3fa..abf6e6e 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/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.tester;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -22,6 +22,7 @@ import jakarta.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/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/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/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/tester/FormTesterSubmitLinkTest.java
index 654fce2..029d03a 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/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.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/tester/FormTesterTest.java
similarity index 94%
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/tester/FormTesterTest.java
index b53011a..6b29bd3 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/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.tester;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -42,9 +42,9 @@ 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.junit.jupiter.api.Disabled;
+import org.apache.wicket.util.tester.FormTester;
+import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -65,7 +65,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());
@@ -90,7 +90,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");
@@ -115,7 +115,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);
@@ -150,7 +150,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);
@@ -159,7 +159,7 @@ class FormTesterTest extends WicketTestCase
 
 		FormTester formTester = tester.newFormTester("form");
 		formTester.setFile("file",
-			new File(getBasedir() + "src/test/java/org/apache/wicket/util/tester/bg.jpg"),
+			new File(getBasedir() + "src/test/java/org/apache/wicket/core/util/tester/bg.jpg"),
 			"image/jpeg");
 		formTester.setValue("text", "Mock value");
 		formTester.submit();
@@ -209,7 +209,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/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/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/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/tester/MockAjaxFormPage.java
index eeaf101..a290ccc 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/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.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/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/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/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/tester/MockFormFileUploadPage.java
index ec5cf1e..4b34d76 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/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.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/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/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/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/tester/MockFormPage.java
index c8c4689..f115a54 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/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.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/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/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/tester/MockFormSubmitsPage.java
similarity index 98%
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/tester/MockFormSubmitsPage.java
index 05b2040..3c7674c 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/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.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/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/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/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/tester/MockPageAjaxSubmitLinkSubmitsWholeForm.java
index 86b487a..349506d 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/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.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/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/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/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/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/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/tester/MockPageParameterPage.java
index 3bac594..19a0465 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/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.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/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/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/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/tester/MockPageWithFormAndAjaxFormSubmitBehavior.java
index cf4f07d..e6fc39b 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/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.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/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/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/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/tester/MockPageWithFormAndCheckGroup.java
index 156bb7b..ca20d1f 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/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.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/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/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/tester/MockPageWithLabelInEnclosure.java
similarity index 97%
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/tester/MockPageWithLabelInEnclosure.java
index 0c1d146..dfdbe05 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/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.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/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/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/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/tester/MockPageWithLinkAndLabel.java
index b55a572..85ff8ec 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/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.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/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/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/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/tester/MockResourceLinkPage.java
index 801066c..b4c390e 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/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.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/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/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/tester/NestedFormPage.java
similarity index 97%
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/tester/NestedFormPage.java
index 62b5037..bfca849 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/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.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/tester/StartComponentInPageRedirectToRenderTest.java
similarity index 94%
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/tester/StartComponentInPageRedirectToRenderTest.java
index 5fc8db2..4ac8b9e 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/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.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/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/tester/TagTesterTest.java
index 1f040f1..7ae7844 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/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.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/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/tester/WicketTesterClickExternalLinkTest.java
index 5789165..66b249e 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/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.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/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/tester/WicketTesterCookieTest.java
index 5e163a6..4b80762 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/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.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 jakarta.servlet.http.Cookie;
 
+import org.apache.wicket.core.util.tester.apps_1.CreateBook;
+import org.apache.wicket.core.util.tester.cookies.CollectAllRequestCookiesPage;
+import org.apache.wicket.core.util.tester.cookies.EndPage;
+import org.apache.wicket.core.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/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/tester/WicketTesterLazyIsPageStatelessBase.java
index fb62b82..4a6d253 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/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.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/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/tester/WicketTesterLazyIsPageStatelessOnePassTest.java
index 1bfd770..8c9e268 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/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.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/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/tester/WicketTesterLazyIsPageStatelessRedirectToBufferTest.java
index c7f3c48..fbdf84c 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/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.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/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/tester/WicketTesterLazyIsPageStatelessRedirectToRenderTest.java
index 5cec01a..3fc94fa 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/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.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/tester/WicketTesterSessionCreationTest.java
similarity index 91%
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/tester/WicketTesterSessionCreationTest.java
index efda451..800589d 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/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.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/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/tester/WicketTesterSessionInvalidateTest.java
index ce207f4..09b7815 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/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.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/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/tester/WicketTesterTest.java
index 0a6631a..e00ad3f 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/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.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.tester.apps_1.Book;
+import org.apache.wicket.core.util.tester.apps_1.CreateBook;
+import org.apache.wicket.core.util.tester.apps_1.MyMockApplication;
+import org.apache.wicket.core.util.tester.apps_1.SuccessPage;
+import org.apache.wicket.core.util.tester.apps_1.ViewBook;
+import org.apache.wicket.core.util.tester.apps_6.LinkPage;
+import org.apache.wicket.core.util.tester.apps_6.ResultPage;
+import org.apache.wicket.core.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.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/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/tester/apps_1/Book.java
index 4121ece..a1ade72 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/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.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/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/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/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/tester/apps_1/CreateBook.java
index ed52918..2a8fda1 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/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.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/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/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/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/tester/apps_1/MyMockApplication.java
index e094a7b..53777a8 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/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.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/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/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/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/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/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/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/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/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/tester/apps_1/SuccessPage.java
similarity index 95%
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/tester/apps_1/SuccessPage.java
index 145727c..99a0382 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/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.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/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/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/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/tester/apps_1/ViewBook.java
index ccd13bf..1c7d338 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/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.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/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/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/tester/apps_2/LoginPage.java
similarity index 95%
rename from wicket-core/src/test/java/org/apache/wicket/util/tester/apps_2/LoginPage.java
rename to wicket-core/src/test/java/org/apache/wicket/core/util/tester/apps_2/LoginPage.java
index 3e7d86a..5951d90 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/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.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/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/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/tester/apps_2/RedirectPage.java
similarity index 95%
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/tester/apps_2/RedirectPage.java
index cbb7a28..959eb30 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/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.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/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/tester/apps_2/Test.java
index fc9a5b0..c04e9aa 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/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.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/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/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/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/tester/apps_3/ChoicePage.java
index ac41e38..dad21a2 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/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.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.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/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/tester/apps_3/FormTesterTest.java
index ff65101..6d62689 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/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.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.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/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/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/tester/apps_4/EmailPage.java
similarity index 97%
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/tester/apps_4/EmailPage.java
index b71f152..b0ca9a1 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/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.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/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/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/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/tester/apps_4/FormTesterTest.java
index 8a4b12e..b564504 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/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.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/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/tester/apps_5/AjaxLinkClickTest.java
index cf9a8e5..650b8bb 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/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.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/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/tester/apps_5/AjaxSubmitLinkClickTest.java
index d482026..5a940e5 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/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.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/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/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/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/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/tester/apps_5/MockPageWithFormAndContainedLink.java
index 049750e..686feaa 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/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.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/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/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/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/tester/apps_5/MockPageWithFormAndLink.java
index 803d9f0..fe92c85 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/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.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/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/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/tester/apps_5/MockPageWithLink.java
similarity index 95%
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/tester/apps_5/MockPageWithLink.java
index 2e9c30a..5e61d45 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/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.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/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/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/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/tester/apps_6/LinkPage.java
index bc9d6de..0fbc278 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/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.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/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/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/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/tester/apps_6/ResultPage.java
index f52069b..3c3d6a8 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/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.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/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/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/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/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/tester/apps_7/HomePage.java
index 0a6f6fe..ee9e37f 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/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.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/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/tester/apps_7/TestHomePage.java
index 1246034..da91a05 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/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.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/tester/apps_7/WicketApplication.java
similarity index 96%
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/tester/apps_7/WicketApplication.java
index e5ab674..555b8e4 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/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.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/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/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/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/tester/apps_8/ComponentFeedbackResourceTestingPage.java
index fec8efc..8e5fab0 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/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.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/tester/apps_8/TestResourceProvidingLabel.java
similarity index 96%
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/tester/apps_8/TestResourceProvidingLabel.java
index b3a30ca..ff6c827 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/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.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/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/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/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/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/tester/cookies/CollectAllRequestCookiesPage.java
similarity index 96%
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/tester/cookies/CollectAllRequestCookiesPage.java
index ef74c22..d599569 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/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.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/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/tester/cookies/EndPage.java
index 4bed69f..4b17864 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/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.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/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/tester/cookies/SetCookiePage.java
index 7dfadb8..0f59798 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/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.tester.cookies;
 
 import jakarta.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/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/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..c8b666e 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.ExceptionTestBase;
 
 
 /**
diff --git a/wicket-devutils/pom.xml b/wicket-devutils/pom.xml
index ebd2c49..aa29e0f 100644
--- a/wicket-devutils/pom.xml
+++ b/wicket-devutils/pom.xml
@@ -32,10 +32,6 @@
 		turned on for additional production debugging.
 	</description>
 
-	<properties>
-		<automatic-module-name>org.apache.wicket.devutils</automatic-module-name>
-	</properties>
-
 	<dependencies>
 		<dependency>
 			<groupId>org.apache.wicket</groupId>
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage.java b/wicket-devutils/src/main/java/module-info.java
similarity index 56%
copy from wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage.java
copy to wicket-devutils/src/main/java/module-info.java
index 74d4084..e9133eb 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/resource/BundlesPage.java
+++ b/wicket-devutils/src/main/java/module-info.java
@@ -14,30 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.resource;
 
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptHeaderItem;
-import org.apache.wicket.markup.html.WebPage;
+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;
 
-/**
- * @author papegaaij
- */
-public class BundlesPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Construct.
-	 */
-	public BundlesPage()
-	{
-	}
+    provides org.apache.wicket.IInitializer with org.apache.wicket.devutils.debugbar.DebugBarInitializer;
 
-	@Override
-	public void renderHead(IHeaderResponse response)
-	{
-		response.render(JavaScriptHeaderItem.forReference(new JavaScriptResourceReference(
-			ResouceBundleTest.class, "a.js")));
-	}
+    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-devutils/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-devutils/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-devutils/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-experimental/wicket-metrics/pom.xml b/wicket-experimental/wicket-metrics/pom.xml
index 3f5566b..54ae946 100644
--- a/wicket-experimental/wicket-metrics/pom.xml
+++ b/wicket-experimental/wicket-metrics/pom.xml
@@ -32,10 +32,6 @@
 		about web applications build on the web framework.
 	</description>
 
-	<properties>
-		<automatic-module-name>org.apache.wicket.metrics</automatic-module-name>
-	</properties>
-
 	<dependencies>
 		<dependency>
 			<groupId>jakarta.servlet</groupId>
diff --git a/wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderPage.java b/wicket-experimental/wicket-metrics/src/main/java/module-info.java
similarity index 50%
rename from wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderPage.java
rename to wicket-experimental/wicket-metrics/src/main/java/module-info.java
index 065caab..e151e0e 100644
--- a/wicket-core/src/test/java/org/apache/wicket/request/cycle/MultiRequestCycleListenerCallOrderPage.java
+++ b/wicket-experimental/wicket-metrics/src/main/java/module-info.java
@@ -14,42 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.wicket.request.cycle;
 
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.AjaxLink;
-import org.apache.wicket.markup.html.WebPage;
-import org.apache.wicket.markup.html.link.Link;
+module org.apache.wicket.metrics {
+    requires org.apache.wicket.core;
+    requires org.aspectj.runtime;
+    requires com.codahale.metrics;
+    requires com.codahale.metrics.jmx;
+    requires jakarta.servlet;
 
-/**
- */
-public class MultiRequestCycleListenerCallOrderPage extends WebPage
-{
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Construct.
-	 */
-	public MultiRequestCycleListenerCallOrderPage()
-	{
-		add(new Link<Void>("link")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick()
-			{
-			}
-		});
-
-		add(new AjaxLink<Void>("ajax")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public void onClick(AjaxRequestTarget target)
-			{
-			}
-		});
-	}
+    exports org.apache.wicket.metrics;
+    exports org.apache.wicket.metrics.aspects;
+    exports org.apache.wicket.metrics.aspects.ajax;
... 976 lines suppressed ...