You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2022/10/16 23:09:43 UTC

[logging-log4j2] branch master updated (bfe4597504 -> 33bc18002a)

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

mattsicker pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git


    from bfe4597504 Correct Kafka GitHub Actions configuration
     new 7bb33a00da Extract PropertyEnvironment interface from PropertiesUtil
     new 33bc18002a Move internal log4j-api utils to util3 package

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


Summary of changes:
 .../java/org/apache/log4j/BasicConfigurator.java   |   2 +-
 .../src/main/java/org/apache/log4j/Category.java   |  21 +-
 .../src/main/java/org/apache/log4j/Hierarchy.java  |  16 +-
 .../src/main/java/org/apache/log4j/LogManager.java |   4 +-
 .../src/main/java/org/apache/log4j/Logger.java     |   2 +-
 .../org/apache/log4j/PropertyConfigurator.java     |  30 +-
 .../log4j/config/PropertiesConfiguration.java      |  29 +-
 .../config/PropertiesConfigurationFactory.java     |   2 +-
 .../org/apache/log4j/helpers/OptionConverter.java  |  22 +-
 .../apache/log4j/layout/Log4j1SyslogLayout.java    |   2 +-
 .../org/apache/log4j/xml/Log4jEntityResolver.java  |   8 +-
 .../org/apache/log4j/xml/XmlConfiguration.java     |   4 +-
 .../apache/log4j/xml/XmlConfigurationFactory.java  |   2 +-
 .../test/java/org/apache/log4j/CategoryTest.java   |  25 +-
 .../logging/log4j/test/junit/ClassMatchers.java    |   2 +-
 .../test/junit/Log4j2LauncherSessionListener.java  |   2 +-
 .../log4j/message/FormattedMessageTest.java        |  14 +-
 .../log4j/message/MessageFormatMessageTest.java    |   5 +-
 .../logging/log4j/util/DeserializerHelper.java     |   2 +
 .../logging/log4j/{util => util3}/CharsTest.java   |   5 +-
 .../log4j/{util => util3}/ClassLocator.java        |   2 +-
 .../log4j/{util => util3}/ClassNameLocator.java    |   2 +-
 .../log4j/{util => util3}/ConstantsTest.java       |   4 +-
 ...EnvironmentPropertySourceSecurityManagerIT.java |   2 +-
 .../EnvironmentPropertySourceTest.java             |   9 +-
 .../log4j/{util => util3}/LoaderUtilTest.java      |   2 +-
 .../Log4jCharsetsPropertiesTest.java               |   2 +-
 .../{util => util3}/PropertiesUtilOrderTest.java   |  18 +-
 .../log4j/{util => util3}/PropertiesUtilTest.java  |  20 +-
 ...ropertyFilePropertySourceSecurityManagerIT.java |   3 +-
 .../log4j/{util => util3}/ProviderUtilTest.java    |   4 +-
 .../log4j/{ => util3}/ServiceLoaderUtilTest.java   |   4 +-
 .../{util => util3}/SortedArrayStringMapTest.java  |   7 +-
 .../{util => util3}/StackLocatorUtilTest.java      |   2 +-
 .../log4j/{util => util3}/StringBuildersTest.java  |   4 +-
 ...mPropertiesPropertySourceSecurityManagerIT.java |   6 +-
 .../SystemPropertiesPropertySourceTest.java        |   7 +-
 log4j-api/pom.xml                                  |   2 +-
 log4j-api/revapi.json                              |   3 +-
 log4j-api/src/main/java/module-info.java           |  21 +-
 .../java/org/apache/logging/log4j/LogManager.java  |  11 +-
 .../org/apache/logging/log4j/MarkerManager.java    |   6 +-
 .../org/apache/logging/log4j/ThreadContext.java    |  25 +-
 .../logging/log4j/internal/DefaultLogBuilder.java  |   2 +-
 .../log4j/message/BasicThreadInformation.java      |   4 +-
 .../apache/logging/log4j/message/MapMessage.java   |  18 +-
 .../log4j/message/MapMessageJsonFormatter.java     |   4 +-
 .../logging/log4j/message/ObjectMessage.java       |   6 +-
 .../logging/log4j/message/ParameterFormatter.java  |   4 +-
 .../logging/log4j/message/ParameterVisitable.java  |   2 +-
 .../log4j/message/ParameterizedMessage.java        |   8 +-
 .../logging/log4j/message/ReusableMessage.java     |   2 +-
 .../log4j/message/ReusableMessageFactory.java      |   2 +-
 .../log4j/message/ReusableObjectMessage.java       |   4 +-
 .../message/ReusableParameterizedMessage.java      |   6 +-
 .../log4j/message/ReusableSimpleMessage.java       |   2 +-
 .../logging/log4j/message/StringMapMessage.java    |   2 +-
 .../log4j/message/StructuredDataMessage.java       |   4 +-
 .../logging/log4j/message/ThreadDumpMessage.java   |   2 +-
 .../apache/logging/log4j/simple/SimpleLogger.java  |  16 +-
 .../logging/log4j/simple/SimpleLoggerContext.java  |  15 +-
 .../apache/logging/log4j/spi/AbstractLogger.java   |  10 +-
 .../logging/log4j/spi/AbstractLoggerAdapter.java   |   2 +-
 .../CopyOnWriteSortedArrayThreadContextMap.java    |   5 +-
 .../logging/log4j/spi/DefaultThreadContextMap.java |   5 +-
 .../log4j/spi/DefaultThreadContextStack.java       |  10 +-
 .../logging/log4j/spi/ExtendedLoggerWrapper.java   |   2 +-
 .../GarbageFreeSortedArrayThreadContextMap.java    |   5 +-
 .../logging/log4j/spi/ThreadContextMapFactory.java |  11 +-
 .../apache/logging/log4j/status/StatusData.java    |   2 +-
 .../apache/logging/log4j/status/StatusLogger.java  |  27 +-
 .../apache/logging/log4j/util/PropertiesUtil.java  | 661 +--------------------
 .../logging/log4j/util/PropertyEnvironment.java    | 294 +++++++++
 .../log4j/util/PropertyFilePropertySource.java     |   3 +
 .../org/apache/logging/log4j/util/Strings.java     |   3 +
 .../org/apache/logging/log4j/util/TimeUnit.java    |  59 ++
 .../java/org/apache/logging/log4j/util/Unbox.java  |   3 +
 .../apache/logging/log4j/util/package-info.java    |   3 +-
 .../logging/log4j/{util => util3}/Activator.java   |  12 +-
 .../logging/log4j/{util => util3}/Chars.java       |   2 +-
 .../logging/log4j/{util => util3}/Constants.java   |   4 +-
 .../log4j/{util => util3}/EnglishEnums.java        |   2 +-
 .../{util => util3}/EnvironmentPropertySource.java |   5 +-
 .../logging/log4j/{util => util3}/LoaderUtil.java  |  10 +-
 .../log4j/{util => util3}/LowLevelLogUtil.java     |   4 +-
 .../logging/log4j/{util => util3}/NameUtil.java    |   4 +-
 .../{util => util3}/PerformanceSensitive.java      |   2 +-
 .../PrivateSecurityManagerStackTraceUtil.java      |   2 +-
 .../log4j/{util => util3}/PropertiesUtil.java      | 334 +----------
 .../log4j/{util => util3}/ProviderUtil.java        |  10 +-
 .../log4j/{util => util3}/ServiceLoaderUtil.java   |   2 +-
 .../log4j/{util => util3}/ServiceRegistry.java     |  11 +-
 .../log4j/{util => util3}/StackLocator.java        |   4 +-
 .../log4j/{util => util3}/StackLocatorUtil.java    |   3 +-
 .../log4j/{util => util3}/StringBuilders.java      |   4 +-
 .../SystemPropertiesPropertySource.java            |   6 +-
 .../org.apache.logging.log4j.util.PropertySource   |   4 +-
 .../log4j/cassandra/CassandraExtension.java        |   2 +-
 .../logging/log4j/core/test/util/Profiler.java     |   2 +-
 .../logging/log4j/core/TestPatternConverters.java  |   2 +-
 .../log4j/core/appender/SyslogAppenderTest.java    |   2 +-
 .../log4j/core/appender/TlsSyslogAppenderTest.java |   2 +-
 .../log4j/core/appender/TlsSyslogFrameTest.java    |   2 +-
 .../async/AsyncQueueFullPolicyFactoryTest.java     |   6 +-
 .../log4j/core/async/AsyncThreadContextTest.java   |   4 +-
 ...WaitStrategyFactoryConfigGlobalLoggersTest.java |   6 +-
 .../core/async/perftest/ResponseTimeTest.java      |   2 +-
 .../core/impl/ThreadContextDataInjectorTest.java   |  32 +-
 .../logging/log4j/core/layout/GelfLayoutTest.java  |   2 +-
 .../core/net/ssl/SslConfigurationFactoryTest.java  |   2 +-
 .../core/pattern/DatePatternConverterTest.java     |   2 +-
 .../log4j/core/selector/TestClassLoader.java       |   2 +-
 .../logging/log4j/core/util/WatchHttpTest.java     |   2 +-
 .../java/org/apache/logging/log4j/core/Filter.java |   4 +-
 .../apache/logging/log4j/core/LoggerContext.java   |   3 +-
 .../log4j/core/appender/ConsoleAppender.java       |   9 +-
 .../log4j/core/appender/TlsSyslogFrame.java        |   2 +-
 .../logging/log4j/core/async/AsyncLogger.java      |   2 +-
 .../core/async/AsyncLoggerContextSelector.java     |   2 +-
 .../core/async/AsyncQueueFullPolicyFactory.java    |   7 +-
 .../async/DefaultAsyncWaitStrategyFactory.java     |   2 +-
 .../logging/log4j/core/async/DisruptorUtil.java    |   4 +-
 .../log4j/core/async/RingBufferLogEvent.java       |   4 +-
 .../core/async/ThreadNameCachingStrategy.java      |   4 +-
 .../log4j/core/config/AbstractConfiguration.java   |   6 +-
 .../logging/log4j/core/config/AppenderControl.java |   6 +-
 .../log4j/core/config/AppenderControlArraySet.java |   6 +-
 .../AwaitUnconditionallyReliabilityStrategy.java   |   6 +-
 .../log4j/core/config/ConfigurationFactory.java    |   6 +-
 .../log4j/core/config/ConfigurationSource.java     |   4 +-
 .../logging/log4j/core/config/Configurator.java    |   2 +-
 .../core/config/DefaultConfigurationFactory.java   |   7 +-
 .../logging/log4j/core/config/HttpWatcher.java     |   2 +-
 .../logging/log4j/core/config/LoggerConfig.java    |   4 +-
 .../core/config/ReliabilityStrategyFactory.java    |   2 +-
 .../log4j/core/config/arbiters/ClassArbiter.java   |   2 +-
 .../config/plugins/convert/CoreTypeConverters.java |   2 +-
 .../plugins/visit/PluginAttributeVisitor.java      |   2 +-
 .../plugins/visit/PluginConfigurationVisitor.java  |   2 +-
 .../plugins/visit/PluginLoggerContextVisitor.java  |  10 +-
 .../properties/PropertiesConfigurationBuilder.java |   2 +-
 .../logging/log4j/core/filter/CompositeFilter.java |   2 +-
 .../logging/log4j/core/filter/DenyAllFilter.java   |   2 +-
 .../log4j/core/filter/DynamicThresholdFilter.java  |   2 +-
 .../log4j/core/filter/LevelMatchFilter.java        |   2 +-
 .../log4j/core/filter/LevelRangeFilter.java        |   2 +-
 .../logging/log4j/core/filter/MapFilter.java       |   2 +-
 .../logging/log4j/core/filter/MarkerFilter.java    |   2 +-
 .../core/filter/MutableThreadContextMapFilter.java |   4 +-
 .../logging/log4j/core/filter/NoMarkerFilter.java  |   2 +-
 .../log4j/core/filter/StringMatchFilter.java       |   2 +-
 .../log4j/core/filter/StructuredDataFilter.java    |   4 +-
 .../log4j/core/filter/ThreadContextMapFilter.java  |   2 +-
 .../logging/log4j/core/filter/ThresholdFilter.java |   2 +-
 .../logging/log4j/core/filter/TimeFilter.java      |   2 +-
 .../log4j/core/impl/ContextDataFactory.java        |  10 +-
 .../core/impl/ContextDataInjectorFactory.java      |   2 +-
 .../logging/log4j/core/impl/DefaultBundle.java     |   9 +-
 .../logging/log4j/core/impl/DefaultCallback.java   |   2 +-
 .../log4j/core/impl/Log4jContextFactory.java       |   4 +-
 .../logging/log4j/core/impl/Log4jLogEvent.java     |   2 +-
 .../logging/log4j/core/impl/MutableLogEvent.java   |  23 +-
 .../log4j/core/impl/ThreadContextDataInjector.java |   2 +-
 .../logging/log4j/core/impl/ThrowableProxy.java    |   2 +-
 .../log4j/core/impl/ThrowableProxyHelper.java      |   2 +-
 .../org/apache/logging/log4j/core/jmx/Server.java  |   4 +-
 .../log4j/core/layout/AbstractStringLayout.java    |   4 +-
 .../logging/log4j/core/layout/PatternLayout.java   |   9 +-
 .../logging/log4j/core/layout/Rfc5424Layout.java   |   2 +-
 .../logging/log4j/core/layout/SyslogLayout.java    |   2 +-
 .../logging/log4j/core/lookup/StrMatcher.java      |   2 +-
 .../core/message/ExtendedThreadInformation.java    |   6 +-
 .../apache/logging/log4j/core/net/Facility.java    |   2 +-
 .../log4j/core/net/MulticastDnsAdvertiser.java     |   2 +-
 .../log4j/core/net/UrlConnectionFactory.java       |  21 +-
 .../core/net/ssl/SslConfigurationFactory.java      |   7 +-
 .../apache/logging/log4j/core/osgi/Activator.java  |   4 +-
 .../log4j/core/osgi/BundleContextSelector.java     |   2 +-
 .../core/pattern/AbstractStyleNameConverter.java   |   2 +-
 .../logging/log4j/core/pattern/AnsiEscape.java     |   6 +-
 .../log4j/core/pattern/DatePatternConverter.java   |   4 +-
 .../core/pattern/EncodingPatternConverter.java     |   6 +-
 .../core/pattern/EndOfBatchPatternConverter.java   |   2 +-
 .../pattern/EqualsBaseReplacementConverter.java    |   6 +-
 .../EqualsIgnoreCaseReplacementConverter.java      |   4 +-
 .../core/pattern/EqualsReplacementConverter.java   |   4 +-
 .../core/pattern/FileDatePatternConverter.java     |   2 +-
 .../logging/log4j/core/pattern/FormattingInfo.java |   2 +-
 .../log4j/core/pattern/HighlightConverter.java     |   2 +-
 .../core/pattern/IntegerPatternConverter.java      |   2 +-
 .../log4j/core/pattern/LevelPatternConverter.java  |   2 +-
 .../pattern/LineSeparatorPatternConverter.java     |   2 +-
 .../core/pattern/LiteralPatternConverter.java      |   2 +-
 .../core/pattern/LoggerFqcnPatternConverter.java   |   2 +-
 .../log4j/core/pattern/LoggerPatternConverter.java |   2 +-
 .../log4j/core/pattern/MarkerPatternConverter.java |   4 +-
 .../pattern/MarkerSimpleNamePatternConverter.java  |   2 +-
 .../log4j/core/pattern/MaxLengthConverter.java     |   2 +-
 .../log4j/core/pattern/MdcPatternConverter.java    |   4 +-
 .../core/pattern/MessagePatternConverter.java      |   2 +-
 .../log4j/core/pattern/NameAbbreviator.java        |   4 +-
 .../log4j/core/pattern/NamePatternConverter.java   |   2 +-
 .../core/pattern/NanoTimePatternConverter.java     |   2 +-
 .../log4j/core/pattern/NdcPatternConverter.java    |   2 +-
 .../core/pattern/RelativeTimePatternConverter.java |   6 +-
 .../log4j/core/pattern/RepeatPatternConverter.java |   2 +-
 .../pattern/SequenceNumberPatternConverter.java    |   2 +-
 .../pattern/SimpleLiteralPatternConverter.java     |   2 +-
 .../logging/log4j/core/pattern/StyleConverter.java |   2 +-
 .../core/pattern/ThreadIdPatternConverter.java     |   2 +-
 .../core/pattern/ThreadNamePatternConverter.java   |   2 +-
 .../pattern/ThreadPriorityPatternConverter.java    |   2 +-
 .../VariablesNotEmptyReplacementConverter.java     |   2 +-
 .../core/selector/ClassLoaderContextSelector.java  |   2 +-
 .../logging/log4j/core/time/MutableInstant.java    |   7 +-
 .../log4j/core/time/internal/SystemClock.java      |   2 +-
 .../core/util/BasicAuthorizationProvider.java      |  12 +-
 .../apache/logging/log4j/core/util/Constants.java  |   8 +-
 .../org/apache/logging/log4j/core/util/Loader.java |   6 +-
 .../logging/log4j/core/util/OptionConverter.java   |  12 +-
 .../apache/logging/log4j/core/util/UuidUtil.java   |   2 +-
 .../logging/log4j/core/util/WatchManager.java      |   2 +-
 .../logging/log4j/couchdb/CouchDbProvider.java     |   2 +-
 .../apache/logging/log4j/docker/DockerLookup.java  |   5 +-
 .../log4j/flume/appender/FlumeEmbeddedManager.java |  14 +-
 .../log4j/gctests/GcFreeLoggingTestUtil.java       |   4 +-
 .../org/apache/logging/log4j/io/IoBuilder.java     |  16 +-
 .../logging/log4j/web/Log4jWebInitializerImpl.java |   9 +-
 .../org/apache/logging/log4j/web/PropertyTest.java |   2 +-
 .../org/apache/logging/log4j/jcl/LogAdapter.java   |   2 +-
 .../log4j/jdbc/appender/ColumnConfigTest.java      |   1 -
 .../log4j/jeromq/appender/JeroMqManager.java       |  10 +-
 .../logging/log4j/jpa/appender/JpaAppender.java    |   2 +-
 .../ContextDataJsonAttributeConverter.java         |  24 +-
 .../jpa/converter/ThrowableAttributeConverter.java |   2 +-
 .../jpa/appender/AbstractJpaAppenderTest.java      |  22 +-
 .../log4j/jpl/Log4jSystemLoggerAdapter.java        |   8 +-
 .../logging/log4j/jul/AbstractLoggerAdapter.java   |   6 +-
 .../apache/logging/log4j/jul/LevelTranslator.java  |   4 +-
 .../org/apache/logging/log4j/jul/LogManager.java   |  10 +-
 .../kubernetes/KubernetesClientProperties.java     |  10 +-
 .../logging/log4j/kubernetes/KubernetesLookup.java |   2 +-
 .../template/json/JsonTemplateLayoutTest.java      |   1 -
 .../template/json/JsonTemplateLayoutDefaults.java  |   5 +-
 .../template/json/util/RecyclerFactories.java      |   4 +-
 .../log4j/layout/template/json/util/Uris.java      |   2 +-
 .../logging/log4j/mongodb3/MongoDb3Provider.java   |   4 +-
 .../perf/jmh/AnnotationVsMarkerInterface.java      |   6 +-
 .../log4j/perf/jmh/ReflectionBenchmark.java        |  10 +-
 .../perf/jmh/SortedArrayVsHashMapBenchmark.java    |   1 -
 .../perf/jmh/StringBuilderEscapeBenchmark.java     |   2 +-
 .../CopyOnWriteOpenHashMapThreadContextMap.java    |   2 +-
 .../GarbageFreeOpenHashMapThreadContextMap.java    |   2 +-
 .../plugins/condition/OnPropertyConditionTest.java |   8 +-
 log4j-plugins/pom.xml                              |   1 +
 .../plugins/condition/OnPropertyCondition.java     |   2 +-
 .../log4j/plugins/convert/EnumConverter.java       |   2 +-
 .../logging/log4j/plugins/di/DefaultInjector.java  |   8 +-
 .../log4j/plugins/model/PluginNamespace.java       |   9 -
 .../log4j/plugins/model/PluginRegistry.java        |   2 +-
 .../logging/log4j/plugins/util/ResolverUtil.java   |   2 +-
 .../validators/RequiredClassValidator.java         |   2 +-
 .../validators/RequiredPropertyValidator.java      |   2 +-
 .../plugins/visit/PluginAttributeVisitor.java      |   2 +-
 .../visit/PluginBuilderAttributeVisitor.java       |   2 +-
 .../log4j/plugins/visit/PluginElementVisitor.java  |   2 +-
 .../log4j/plugins/visit/PluginNodeVisitor.java     |   2 +-
 .../log4j/plugins/visit/PluginValueVisitor.java    |   2 +-
 .../log4j/configuration/CustomConfiguration.java   |   6 +-
 .../logging/log4j/script/ScriptManagerImpl.java    |   2 +-
 .../script/factory/ScriptManagerFactoryImpl.java   |   3 +-
 .../java/org/apache/logging/slf4j/Log4jLogger.java |  12 +-
 .../apache/logging/slf4j/Log4jLoggerFactory.java   |   2 +-
 .../apache/logging/slf4j/Log4jLoggerFactory.java   |   2 +-
 .../logging/log4j/smtp/appender/SmtpManager.java   |   6 +-
 .../spring/boot/Log4j2SpringBootLoggingSystem.java |   3 +-
 .../log4j/tojul/JULLoggerContextFactory.java       |   5 +-
 .../logging/log4j/tojul/LazyLog4jLogRecord.java    |   5 +-
 .../logging/slf4j/SLF4JLoggerContextFactory.java   |   2 +-
 .../logging/log4j/web/Log4jWebInitializerImpl.java |   9 +-
 .../org/apache/logging/log4j/web/PropertyTest.java |   2 +-
 281 files changed, 1146 insertions(+), 1647 deletions(-)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/CharsTest.java (92%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/ClassLocator.java (96%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/ClassNameLocator.java (96%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/ConstantsTest.java (92%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/EnvironmentPropertySourceSecurityManagerIT.java (98%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/EnvironmentPropertySourceTest.java (95%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/LoaderUtilTest.java (98%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/Log4jCharsetsPropertiesTest.java (97%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/PropertiesUtilOrderTest.java (96%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/PropertiesUtilTest.java (96%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/PropertyFilePropertySourceSecurityManagerIT.java (96%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/ProviderUtilTest.java (97%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{ => util3}/ServiceLoaderUtilTest.java (96%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/SortedArrayStringMapTest.java (99%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/StackLocatorUtilTest.java (99%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/StringBuildersTest.java (96%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/SystemPropertiesPropertySourceSecurityManagerIT.java (92%)
 rename log4j-api-test/src/test/java/org/apache/logging/log4j/{util => util3}/SystemPropertiesPropertySourceTest.java (86%)
 create mode 100644 log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyEnvironment.java
 create mode 100644 log4j-api/src/main/java/org/apache/logging/log4j/util/TimeUnit.java
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/Activator.java (99%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/Chars.java (98%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/Constants.java (98%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/EnglishEnums.java (98%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/EnvironmentPropertySource.java (95%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/LoaderUtil.java (98%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/LowLevelLogUtil.java (97%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/NameUtil.java (97%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/PerformanceSensitive.java (97%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/PrivateSecurityManagerStackTraceUtil.java (98%)
 copy log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/PropertiesUtil.java (54%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/ProviderUtil.java (99%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/ServiceLoaderUtil.java (99%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/ServiceRegistry.java (96%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/StackLocator.java (98%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/StackLocatorUtil.java (98%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/StringBuilders.java (99%)
 rename log4j-api/src/main/java/org/apache/logging/log4j/{util => util3}/SystemPropertiesPropertySource.java (93%)


[logging-log4j2] 02/02: Move internal log4j-api utils to util3 package

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

mattsicker pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 33bc18002a7477db7fe03a4464eac5d5cefa9258
Author: Matt Sicker <ma...@apache.org>
AuthorDate: Sun Oct 16 18:09:21 2022 -0500

    Move internal log4j-api utils to util3 package
    
    This centralizes internal utility classes into a package that is only exported to other log4j modules explicitly. A couple classes marked as internal are not handled at this time due to some complexities in migrating fully:
    
    - SortedArrayStringMap: being a Serializable class, the package name is part of its published API. This cannot be moved without breaking that.
    - Strings: besides being referenced in many places via Strings.EMPTY, this seems to be cached elsewhere, too.
    
    Signed-off-by: Matt Sicker <ma...@apache.org>
---
 .../java/org/apache/log4j/BasicConfigurator.java   |   2 +-
 .../src/main/java/org/apache/log4j/Category.java   |  21 +-
 .../src/main/java/org/apache/log4j/Hierarchy.java  |  16 +-
 .../src/main/java/org/apache/log4j/LogManager.java |   4 +-
 .../src/main/java/org/apache/log4j/Logger.java     |   2 +-
 .../org/apache/log4j/PropertyConfigurator.java     |  30 +-
 .../log4j/config/PropertiesConfiguration.java      |  29 +-
 .../config/PropertiesConfigurationFactory.java     |   2 +-
 .../org/apache/log4j/helpers/OptionConverter.java  |  22 +-
 .../apache/log4j/layout/Log4j1SyslogLayout.java    |   2 +-
 .../org/apache/log4j/xml/Log4jEntityResolver.java  |   8 +-
 .../org/apache/log4j/xml/XmlConfiguration.java     |   4 +-
 .../apache/log4j/xml/XmlConfigurationFactory.java  |   2 +-
 .../test/java/org/apache/log4j/CategoryTest.java   |  25 +-
 .../logging/log4j/test/junit/ClassMatchers.java    |   2 +-
 .../test/junit/Log4j2LauncherSessionListener.java  |   2 +-
 .../log4j/message/FormattedMessageTest.java        |  14 +-
 .../log4j/message/MessageFormatMessageTest.java    |   5 +-
 .../logging/log4j/util/DeserializerHelper.java     |   2 +
 .../logging/log4j/{util => util3}/CharsTest.java   |   5 +-
 .../log4j/{util => util3}/ClassLocator.java        |   2 +-
 .../log4j/{util => util3}/ClassNameLocator.java    |   2 +-
 .../log4j/{util => util3}/ConstantsTest.java       |   4 +-
 ...EnvironmentPropertySourceSecurityManagerIT.java |   2 +-
 .../EnvironmentPropertySourceTest.java             |   9 +-
 .../log4j/{util => util3}/LoaderUtilTest.java      |   2 +-
 .../Log4jCharsetsPropertiesTest.java               |   2 +-
 .../{util => util3}/PropertiesUtilOrderTest.java   |  18 +-
 .../log4j/{util => util3}/PropertiesUtilTest.java  |  20 +-
 ...ropertyFilePropertySourceSecurityManagerIT.java |   3 +-
 .../log4j/{util => util3}/ProviderUtilTest.java    |   4 +-
 .../log4j/{ => util3}/ServiceLoaderUtilTest.java   |   4 +-
 .../{util => util3}/SortedArrayStringMapTest.java  |   7 +-
 .../{util => util3}/StackLocatorUtilTest.java      |   2 +-
 .../log4j/{util => util3}/StringBuildersTest.java  |   4 +-
 ...mPropertiesPropertySourceSecurityManagerIT.java |   6 +-
 .../SystemPropertiesPropertySourceTest.java        |   7 +-
 log4j-api/pom.xml                                  |   2 +-
 log4j-api/revapi.json                              |   3 +-
 log4j-api/src/main/java/module-info.java           |  21 +-
 .../java/org/apache/logging/log4j/LogManager.java  |   8 +-
 .../org/apache/logging/log4j/MarkerManager.java    |   6 +-
 .../org/apache/logging/log4j/ThreadContext.java    |   2 +-
 .../logging/log4j/internal/DefaultLogBuilder.java  |   2 +-
 .../log4j/message/BasicThreadInformation.java      |   4 +-
 .../apache/logging/log4j/message/MapMessage.java   |  18 +-
 .../log4j/message/MapMessageJsonFormatter.java     |   4 +-
 .../logging/log4j/message/ObjectMessage.java       |   6 +-
 .../logging/log4j/message/ParameterFormatter.java  |   4 +-
 .../logging/log4j/message/ParameterVisitable.java  |   2 +-
 .../log4j/message/ParameterizedMessage.java        |   8 +-
 .../logging/log4j/message/ReusableMessage.java     |   2 +-
 .../log4j/message/ReusableMessageFactory.java      |   2 +-
 .../log4j/message/ReusableObjectMessage.java       |   4 +-
 .../message/ReusableParameterizedMessage.java      |   6 +-
 .../log4j/message/ReusableSimpleMessage.java       |   2 +-
 .../logging/log4j/message/StringMapMessage.java    |   2 +-
 .../log4j/message/StructuredDataMessage.java       |   4 +-
 .../logging/log4j/message/ThreadDumpMessage.java   |   2 +-
 .../logging/log4j/simple/SimpleLoggerContext.java  |   2 +-
 .../apache/logging/log4j/spi/AbstractLogger.java   |  10 +-
 .../logging/log4j/spi/AbstractLoggerAdapter.java   |   2 +-
 .../CopyOnWriteSortedArrayThreadContextMap.java    |   2 +-
 .../logging/log4j/spi/DefaultThreadContextMap.java |   2 +-
 .../log4j/spi/DefaultThreadContextStack.java       |  10 +-
 .../logging/log4j/spi/ExtendedLoggerWrapper.java   |   2 +-
 .../GarbageFreeSortedArrayThreadContextMap.java    |   2 +-
 .../logging/log4j/spi/ThreadContextMapFactory.java |   6 +-
 .../apache/logging/log4j/status/StatusData.java    |   2 +-
 .../apache/logging/log4j/status/StatusLogger.java  |   4 +-
 .../apache/logging/log4j/util/PropertiesUtil.java  | 413 +--------------------
 .../logging/log4j/util/PropertyEnvironment.java    |   5 +-
 .../log4j/util/PropertyFilePropertySource.java     |   3 +
 .../org/apache/logging/log4j/util/Strings.java     |   3 +
 .../org/apache/logging/log4j/util/TimeUnit.java    |  59 +++
 .../java/org/apache/logging/log4j/util/Unbox.java  |   3 +
 .../apache/logging/log4j/util/package-info.java    |   3 +-
 .../logging/log4j/{util => util3}/Activator.java   |  12 +-
 .../logging/log4j/{util => util3}/Chars.java       |   2 +-
 .../logging/log4j/{util => util3}/Constants.java   |   4 +-
 .../log4j/{util => util3}/EnglishEnums.java        |   2 +-
 .../{util => util3}/EnvironmentPropertySource.java |   5 +-
 .../logging/log4j/{util => util3}/LoaderUtil.java  |  10 +-
 .../log4j/{util => util3}/LowLevelLogUtil.java     |   4 +-
 .../logging/log4j/{util => util3}/NameUtil.java    |   4 +-
 .../{util => util3}/PerformanceSensitive.java      |   2 +-
 .../PrivateSecurityManagerStackTraceUtil.java      |   2 +-
 .../log4j/{util => util3}/PropertiesUtil.java      |  56 +--
 .../log4j/{util => util3}/ProviderUtil.java        |  10 +-
 .../log4j/{util => util3}/ServiceLoaderUtil.java   |   2 +-
 .../log4j/{util => util3}/ServiceRegistry.java     |  11 +-
 .../log4j/{util => util3}/StackLocator.java        |   4 +-
 .../log4j/{util => util3}/StackLocatorUtil.java    |   3 +-
 .../log4j/{util => util3}/StringBuilders.java      |   4 +-
 .../SystemPropertiesPropertySource.java            |   6 +-
 .../org.apache.logging.log4j.util.PropertySource   |   4 +-
 .../log4j/cassandra/CassandraExtension.java        |   2 +-
 .../logging/log4j/core/test/util/Profiler.java     |   2 +-
 .../logging/log4j/core/TestPatternConverters.java  |   2 +-
 .../log4j/core/appender/SyslogAppenderTest.java    |   2 +-
 .../log4j/core/appender/TlsSyslogAppenderTest.java |   2 +-
 .../log4j/core/appender/TlsSyslogFrameTest.java    |   2 +-
 .../async/AsyncQueueFullPolicyFactoryTest.java     |   2 +-
 .../log4j/core/async/AsyncThreadContextTest.java   |   2 +-
 ...WaitStrategyFactoryConfigGlobalLoggersTest.java |   6 +-
 .../core/async/perftest/ResponseTimeTest.java      |   2 +-
 .../core/impl/ThreadContextDataInjectorTest.java   |   2 +-
 .../logging/log4j/core/layout/GelfLayoutTest.java  |   2 +-
 .../core/net/ssl/SslConfigurationFactoryTest.java  |   2 +-
 .../core/pattern/DatePatternConverterTest.java     |   2 +-
 .../log4j/core/selector/TestClassLoader.java       |   2 +-
 .../logging/log4j/core/util/WatchHttpTest.java     |   2 +-
 .../java/org/apache/logging/log4j/core/Filter.java |   4 +-
 .../apache/logging/log4j/core/LoggerContext.java   |   3 +-
 .../log4j/core/appender/ConsoleAppender.java       |   4 +-
 .../log4j/core/appender/TlsSyslogFrame.java        |   2 +-
 .../logging/log4j/core/async/AsyncLogger.java      |   2 +-
 .../core/async/AsyncLoggerContextSelector.java     |   2 +-
 .../core/async/AsyncQueueFullPolicyFactory.java    |   2 +-
 .../async/DefaultAsyncWaitStrategyFactory.java     |   2 +-
 .../logging/log4j/core/async/DisruptorUtil.java    |   4 +-
 .../log4j/core/async/RingBufferLogEvent.java       |   4 +-
 .../core/async/ThreadNameCachingStrategy.java      |   4 +-
 .../log4j/core/config/AbstractConfiguration.java   |   6 +-
 .../logging/log4j/core/config/AppenderControl.java |   6 +-
 .../log4j/core/config/AppenderControlArraySet.java |   6 +-
 .../AwaitUnconditionallyReliabilityStrategy.java   |   6 +-
 .../log4j/core/config/ConfigurationFactory.java    |   2 +-
 .../log4j/core/config/ConfigurationSource.java     |   4 +-
 .../logging/log4j/core/config/Configurator.java    |   2 +-
 .../core/config/DefaultConfigurationFactory.java   |   4 +-
 .../logging/log4j/core/config/HttpWatcher.java     |   2 +-
 .../logging/log4j/core/config/LoggerConfig.java    |   4 +-
 .../core/config/ReliabilityStrategyFactory.java    |   2 +-
 .../log4j/core/config/arbiters/ClassArbiter.java   |   2 +-
 .../config/plugins/convert/CoreTypeConverters.java |   2 +-
 .../plugins/visit/PluginAttributeVisitor.java      |   2 +-
 .../plugins/visit/PluginConfigurationVisitor.java  |   2 +-
 .../plugins/visit/PluginLoggerContextVisitor.java  |  10 +-
 .../properties/PropertiesConfigurationBuilder.java |   2 +-
 .../logging/log4j/core/filter/CompositeFilter.java |   2 +-
 .../logging/log4j/core/filter/DenyAllFilter.java   |   2 +-
 .../log4j/core/filter/DynamicThresholdFilter.java  |   2 +-
 .../log4j/core/filter/LevelMatchFilter.java        |   2 +-
 .../log4j/core/filter/LevelRangeFilter.java        |   2 +-
 .../logging/log4j/core/filter/MapFilter.java       |   2 +-
 .../logging/log4j/core/filter/MarkerFilter.java    |   2 +-
 .../core/filter/MutableThreadContextMapFilter.java |   4 +-
 .../logging/log4j/core/filter/NoMarkerFilter.java  |   2 +-
 .../log4j/core/filter/StringMatchFilter.java       |   2 +-
 .../log4j/core/filter/StructuredDataFilter.java    |   4 +-
 .../log4j/core/filter/ThreadContextMapFilter.java  |   2 +-
 .../logging/log4j/core/filter/ThresholdFilter.java |   2 +-
 .../logging/log4j/core/filter/TimeFilter.java      |   2 +-
 .../log4j/core/impl/ContextDataFactory.java        |  10 +-
 .../core/impl/ContextDataInjectorFactory.java      |   2 +-
 .../logging/log4j/core/impl/DefaultBundle.java     |   4 +-
 .../logging/log4j/core/impl/DefaultCallback.java   |   2 +-
 .../log4j/core/impl/Log4jContextFactory.java       |   4 +-
 .../logging/log4j/core/impl/Log4jLogEvent.java     |   2 +-
 .../logging/log4j/core/impl/MutableLogEvent.java   |  23 +-
 .../log4j/core/impl/ThreadContextDataInjector.java |   2 +-
 .../logging/log4j/core/impl/ThrowableProxy.java    |   2 +-
 .../log4j/core/impl/ThrowableProxyHelper.java      |   2 +-
 .../org/apache/logging/log4j/core/jmx/Server.java  |   4 +-
 .../log4j/core/layout/AbstractStringLayout.java    |   4 +-
 .../logging/log4j/core/layout/PatternLayout.java   |   2 +-
 .../logging/log4j/core/layout/Rfc5424Layout.java   |   2 +-
 .../logging/log4j/core/layout/SyslogLayout.java    |   2 +-
 .../logging/log4j/core/lookup/StrMatcher.java      |   2 +-
 .../core/message/ExtendedThreadInformation.java    |   6 +-
 .../apache/logging/log4j/core/net/Facility.java    |   2 +-
 .../log4j/core/net/MulticastDnsAdvertiser.java     |   2 +-
 .../log4j/core/net/UrlConnectionFactory.java       |   2 +-
 .../core/net/ssl/SslConfigurationFactory.java      |   2 +-
 .../apache/logging/log4j/core/osgi/Activator.java  |   4 +-
 .../log4j/core/osgi/BundleContextSelector.java     |   2 +-
 .../core/pattern/AbstractStyleNameConverter.java   |   2 +-
 .../logging/log4j/core/pattern/AnsiEscape.java     |   6 +-
 .../log4j/core/pattern/DatePatternConverter.java   |   4 +-
 .../core/pattern/EncodingPatternConverter.java     |   6 +-
 .../core/pattern/EndOfBatchPatternConverter.java   |   2 +-
 .../pattern/EqualsBaseReplacementConverter.java    |   6 +-
 .../EqualsIgnoreCaseReplacementConverter.java      |   4 +-
 .../core/pattern/EqualsReplacementConverter.java   |   4 +-
 .../core/pattern/FileDatePatternConverter.java     |   2 +-
 .../logging/log4j/core/pattern/FormattingInfo.java |   2 +-
 .../log4j/core/pattern/HighlightConverter.java     |   2 +-
 .../core/pattern/IntegerPatternConverter.java      |   2 +-
 .../log4j/core/pattern/LevelPatternConverter.java  |   2 +-
 .../pattern/LineSeparatorPatternConverter.java     |   2 +-
 .../core/pattern/LiteralPatternConverter.java      |   2 +-
 .../core/pattern/LoggerFqcnPatternConverter.java   |   2 +-
 .../log4j/core/pattern/LoggerPatternConverter.java |   2 +-
 .../log4j/core/pattern/MarkerPatternConverter.java |   4 +-
 .../pattern/MarkerSimpleNamePatternConverter.java  |   2 +-
 .../log4j/core/pattern/MaxLengthConverter.java     |   2 +-
 .../log4j/core/pattern/MdcPatternConverter.java    |   4 +-
 .../core/pattern/MessagePatternConverter.java      |   2 +-
 .../log4j/core/pattern/NameAbbreviator.java        |   4 +-
 .../log4j/core/pattern/NamePatternConverter.java   |   2 +-
 .../core/pattern/NanoTimePatternConverter.java     |   2 +-
 .../log4j/core/pattern/NdcPatternConverter.java    |   2 +-
 .../core/pattern/RelativeTimePatternConverter.java |   6 +-
 .../log4j/core/pattern/RepeatPatternConverter.java |   2 +-
 .../pattern/SequenceNumberPatternConverter.java    |   2 +-
 .../pattern/SimpleLiteralPatternConverter.java     |   2 +-
 .../logging/log4j/core/pattern/StyleConverter.java |   2 +-
 .../core/pattern/ThreadIdPatternConverter.java     |   2 +-
 .../core/pattern/ThreadNamePatternConverter.java   |   2 +-
 .../pattern/ThreadPriorityPatternConverter.java    |   2 +-
 .../VariablesNotEmptyReplacementConverter.java     |   2 +-
 .../core/selector/ClassLoaderContextSelector.java  |   2 +-
 .../logging/log4j/core/time/MutableInstant.java    |   7 +-
 .../log4j/core/time/internal/SystemClock.java      |   2 +-
 .../core/util/BasicAuthorizationProvider.java      |   2 +-
 .../apache/logging/log4j/core/util/Constants.java  |   8 +-
 .../org/apache/logging/log4j/core/util/Loader.java |   6 +-
 .../logging/log4j/core/util/OptionConverter.java   |  12 +-
 .../apache/logging/log4j/core/util/UuidUtil.java   |   2 +-
 .../logging/log4j/core/util/WatchManager.java      |   2 +-
 .../logging/log4j/couchdb/CouchDbProvider.java     |   2 +-
 .../apache/logging/log4j/docker/DockerLookup.java  |   2 +-
 .../log4j/flume/appender/FlumeEmbeddedManager.java |  14 +-
 .../log4j/gctests/GcFreeLoggingTestUtil.java       |   4 +-
 .../org/apache/logging/log4j/io/IoBuilder.java     |  16 +-
 .../logging/log4j/web/Log4jWebInitializerImpl.java |   9 +-
 .../org/apache/logging/log4j/web/PropertyTest.java |   2 +-
 .../org/apache/logging/log4j/jcl/LogAdapter.java   |   2 +-
 .../log4j/jdbc/appender/ColumnConfigTest.java      |   1 -
 .../log4j/jeromq/appender/JeroMqManager.java       |  10 +-
 .../logging/log4j/jpa/appender/JpaAppender.java    |   2 +-
 .../ContextDataJsonAttributeConverter.java         |  24 +-
 .../jpa/converter/ThrowableAttributeConverter.java |   2 +-
 .../jpa/appender/AbstractJpaAppenderTest.java      |   2 +-
 .../log4j/jpl/Log4jSystemLoggerAdapter.java        |   8 +-
 .../logging/log4j/jul/AbstractLoggerAdapter.java   |   6 +-
 .../apache/logging/log4j/jul/LevelTranslator.java  |   4 +-
 .../org/apache/logging/log4j/jul/LogManager.java   |  10 +-
 .../kubernetes/KubernetesClientProperties.java     |  10 +-
 .../logging/log4j/kubernetes/KubernetesLookup.java |   2 +-
 .../template/json/JsonTemplateLayoutTest.java      |   1 -
 .../template/json/JsonTemplateLayoutDefaults.java  |   2 +-
 .../template/json/util/RecyclerFactories.java      |   4 +-
 .../log4j/layout/template/json/util/Uris.java      |   2 +-
 .../logging/log4j/mongodb3/MongoDb3Provider.java   |   4 +-
 .../perf/jmh/AnnotationVsMarkerInterface.java      |   6 +-
 .../log4j/perf/jmh/ReflectionBenchmark.java        |  10 +-
 .../perf/jmh/SortedArrayVsHashMapBenchmark.java    |   1 -
 .../perf/jmh/StringBuilderEscapeBenchmark.java     |   2 +-
 .../CopyOnWriteOpenHashMapThreadContextMap.java    |   2 +-
 .../GarbageFreeOpenHashMapThreadContextMap.java    |   2 +-
 .../plugins/condition/OnPropertyConditionTest.java |   2 +-
 log4j-plugins/pom.xml                              |   1 +
 .../plugins/condition/OnPropertyCondition.java     |   2 +-
 .../log4j/plugins/convert/EnumConverter.java       |   2 +-
 .../logging/log4j/plugins/di/DefaultInjector.java  |   8 +-
 .../log4j/plugins/model/PluginNamespace.java       |   9 -
 .../log4j/plugins/model/PluginRegistry.java        |   2 +-
 .../logging/log4j/plugins/util/ResolverUtil.java   |   2 +-
 .../validators/RequiredClassValidator.java         |   2 +-
 .../validators/RequiredPropertyValidator.java      |   2 +-
 .../plugins/visit/PluginAttributeVisitor.java      |   2 +-
 .../visit/PluginBuilderAttributeVisitor.java       |   2 +-
 .../log4j/plugins/visit/PluginElementVisitor.java  |   2 +-
 .../log4j/plugins/visit/PluginNodeVisitor.java     |   2 +-
 .../log4j/plugins/visit/PluginValueVisitor.java    |   2 +-
 .../log4j/configuration/CustomConfiguration.java   |   6 +-
 .../logging/log4j/script/ScriptManagerImpl.java    |   2 +-
 .../script/factory/ScriptManagerFactoryImpl.java   |   3 +-
 .../java/org/apache/logging/slf4j/Log4jLogger.java |  12 +-
 .../apache/logging/slf4j/Log4jLoggerFactory.java   |   2 +-
 .../apache/logging/slf4j/Log4jLoggerFactory.java   |   2 +-
 .../logging/log4j/smtp/appender/SmtpManager.java   |   6 +-
 .../spring/boot/Log4j2SpringBootLoggingSystem.java |   3 +-
 .../log4j/tojul/JULLoggerContextFactory.java       |   5 +-
 .../logging/log4j/tojul/LazyLog4jLogRecord.java    |   5 +-
 .../logging/slf4j/SLF4JLoggerContextFactory.java   |   2 +-
 .../logging/log4j/web/Log4jWebInitializerImpl.java |   9 +-
 .../org/apache/logging/log4j/web/PropertyTest.java |   2 +-
 280 files changed, 718 insertions(+), 1037 deletions(-)

diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/BasicConfigurator.java b/log4j-1.2-api/src/main/java/org/apache/log4j/BasicConfigurator.java
index 14910d8b01..cacbb7b040 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/BasicConfigurator.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/BasicConfigurator.java
@@ -16,7 +16,7 @@
  */
 package org.apache.log4j;
 
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 /**
  * Configures the package.
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java b/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
index 56948f63c0..06efb9b3bb 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
@@ -16,15 +16,6 @@
  */
 package org.apache.log4j;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.Map;
-import java.util.ResourceBundle;
-import java.util.Vector;
-import java.util.concurrent.ConcurrentMap;
-import java.util.stream.Collectors;
-
 import org.apache.log4j.bridge.AppenderAdapter;
 import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.LogEventWrapper;
@@ -37,7 +28,6 @@ import org.apache.log4j.spi.AppenderAttachable;
 import org.apache.log4j.spi.HierarchyEventListener;
 import org.apache.log4j.spi.LoggerRepository;
 import org.apache.log4j.spi.LoggingEvent;
-import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.message.LocalizedMessage;
 import org.apache.logging.log4j.message.MapMessage;
 import org.apache.logging.log4j.message.Message;
@@ -45,8 +35,17 @@ import org.apache.logging.log4j.message.ObjectMessage;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 import org.apache.logging.log4j.spi.LoggerContext;
-import org.apache.logging.log4j.util.StackLocatorUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.ResourceBundle;
+import java.util.Vector;
+import java.util.concurrent.ConcurrentMap;
+import java.util.stream.Collectors;
 
 /**
  * Implementation of the Category class for compatibility, despite it having been deprecated a long, long time ago.
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/Hierarchy.java b/log4j-1.2-api/src/main/java/org/apache/log4j/Hierarchy.java
index 2fe2d79925..eabf2777d2 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/Hierarchy.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/Hierarchy.java
@@ -21,13 +21,6 @@
 
 package org.apache.log4j;
 
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-import java.util.WeakHashMap;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
 import org.apache.log4j.helpers.LogLog;
 import org.apache.log4j.helpers.OptionConverter;
 import org.apache.log4j.legacy.core.ContextUtil;
@@ -42,7 +35,14 @@ import org.apache.log4j.spi.ThrowableRendererSupport;
 import org.apache.logging.log4j.core.appender.AsyncAppender;
 import org.apache.logging.log4j.spi.AbstractLoggerAdapter;
 import org.apache.logging.log4j.spi.LoggerContext;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Vector;
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 /**
  * This class is specialized in retrieving loggers by name and also maintaining the logger hierarchy.
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java b/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java
index 4d0bbd7568..fd9cd67e3f 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/LogManager.java
@@ -24,8 +24,8 @@ import org.apache.log4j.spi.NOPLoggerRepository;
 import org.apache.log4j.spi.RepositorySelector;
 import org.apache.log4j.spi.RootLogger;
 import org.apache.logging.log4j.spi.LoggerContext;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 import java.util.Collections;
 import java.util.Enumeration;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/Logger.java b/log4j-1.2-api/src/main/java/org/apache/log4j/Logger.java
index 19c523ea29..3cae5426e5 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/Logger.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/Logger.java
@@ -18,7 +18,7 @@ package org.apache.log4j;
 
 import org.apache.log4j.spi.LoggerFactory;
 import org.apache.logging.log4j.spi.LoggerContext;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 /**
  *
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/PropertyConfigurator.java b/log4j-1.2-api/src/main/java/org/apache/log4j/PropertyConfigurator.java
index 7069f5f8ce..171080bdbe 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/PropertyConfigurator.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/PropertyConfigurator.java
@@ -16,20 +16,6 @@
  */
 package org.apache.log4j;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Map;
-import java.util.Properties;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
 import org.apache.log4j.bridge.FilterAdapter;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertiesConfiguration;
@@ -49,7 +35,21 @@ import org.apache.log4j.spi.ThrowableRenderer;
 import org.apache.log4j.spi.ThrowableRendererSupport;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.net.UrlConnectionFactory;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.Vector;
 
 /**
  * Configures Log4j from properties.
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
index 5e9b5769d0..1c8fd1792c 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfiguration.java
@@ -16,25 +16,11 @@
  */
 package org.apache.log4j.config;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Properties;
-import java.util.SortedMap;
-import java.util.StringTokenizer;
-import java.util.TreeMap;
-
 import org.apache.log4j.Appender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.PatternLayout;
 import org.apache.log4j.bridge.AppenderAdapter;
-import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.FilterAdapter;
 import org.apache.log4j.builders.BuilderManager;
 import org.apache.log4j.helpers.OptionConverter;
@@ -48,7 +34,20 @@ import org.apache.logging.log4j.core.config.ConfigurationSource;
 import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.config.status.StatusConfiguration;
 import org.apache.logging.log4j.core.filter.ThresholdFilter;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
+import java.util.SortedMap;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
 
 /**
  * Constructs a configuration based on Log4j 1 properties.
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfigurationFactory.java
index c9e6487ee3..b68f2b8c57 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/config/PropertiesConfigurationFactory.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.core.config.ConfigurationSource;
 import org.apache.logging.log4j.core.config.Order;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Configures Log4j from a log4j 1 format properties file.
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
index a96282b061..63dfb0f177 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
@@ -17,15 +17,6 @@
 
 package org.apache.log4j.helpers;
 
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
 import org.apache.log4j.Level;
 import org.apache.log4j.Priority;
 import org.apache.log4j.PropertyConfigurator;
@@ -34,9 +25,18 @@ import org.apache.log4j.spi.LoggerRepository;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.spi.StandardLevel;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.LoaderUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+
+import java.io.InputStream;
+import java.io.InterruptedIOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 /**
  * A convenience class to convert property values to specific types.
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1SyslogLayout.java b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1SyslogLayout.java
index eda97d292d..1488b7c604 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1SyslogLayout.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1SyslogLayout.java
@@ -30,7 +30,7 @@ import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
-import org.apache.logging.log4j.util.Chars;
+import org.apache.logging.log4j.util3.Chars;
 
 import java.io.Serializable;
 import java.nio.charset.Charset;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java
index 9c9226b48c..cdc8446e00 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/Log4jEntityResolver.java
@@ -17,15 +17,15 @@
 
 package org.apache.log4j.xml;
 
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.Constants;
+import org.apache.logging.log4j.util3.Constants;
 import org.xml.sax.EntityResolver;
 import org.xml.sax.InputSource;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
 /**
  * An {@link EntityResolver} specifically designed to return
  * <code>log4j.dtd</code> which is embedded within the log4j jar
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java
index 4c5f017179..a634ef7702 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfiguration.java
@@ -18,7 +18,6 @@ package org.apache.log4j.xml;
 
 import java.io.IOException;
 import java.io.InterruptedIOException;
-import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
@@ -34,7 +33,6 @@ import org.apache.log4j.Appender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.Level;
 import org.apache.log4j.bridge.AppenderAdapter;
-import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.bridge.FilterAdapter;
 import org.apache.log4j.config.Log4j1Configuration;
 import org.apache.log4j.config.PropertySetter;
@@ -51,7 +49,7 @@ import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.config.status.StatusConfiguration;
 import org.apache.logging.log4j.core.filter.ThresholdFilter;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfigurationFactory.java b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfigurationFactory.java
index 8521f0dbfb..9a1fbb6606 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfigurationFactory.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/xml/XmlConfigurationFactory.java
@@ -25,7 +25,7 @@ import org.apache.logging.log4j.core.config.ConfigurationSource;
 import org.apache.logging.log4j.core.config.Order;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Constructs a Configuration usable in Log4j 2 from a Log4j 1 configuration file.
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java b/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
index e474681eb4..481e92340b 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/CategoryTest.java
@@ -17,20 +17,6 @@
 
 package org.apache.log4j;
 
-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.assertNull;
-import static org.junit.jupiter.api.Assertions.assertSame;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Consumer;
-
 import org.apache.log4j.bridge.AppenderAdapter;
 import org.apache.log4j.bridge.AppenderWrapper;
 import org.apache.log4j.spi.LoggingEvent;
@@ -44,13 +30,22 @@ import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.ObjectMessage;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
-import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.Constants;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+import static org.junit.jupiter.api.Assertions.*;
+
 /**
  * Tests of Category.
  */
diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/ClassMatchers.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/ClassMatchers.java
index 0d814f62e9..252115e9bb 100644
--- a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/ClassMatchers.java
+++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/ClassMatchers.java
@@ -17,7 +17,7 @@
 
 package org.apache.logging.log4j.test.junit;
 
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 import org.hamcrest.CustomTypeSafeMatcher;
 import org.hamcrest.Matcher;
 
diff --git a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/Log4j2LauncherSessionListener.java b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/Log4j2LauncherSessionListener.java
index 51abd82afe..a2f40e0960 100644
--- a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/Log4j2LauncherSessionListener.java
+++ b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/Log4j2LauncherSessionListener.java
@@ -16,7 +16,7 @@
  */
 package org.apache.logging.log4j.test.junit;
 
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.junit.platform.launcher.LauncherSession;
 import org.junit.platform.launcher.LauncherSessionListener;
 
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/FormattedMessageTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/FormattedMessageTest.java
index 70f3c73cae..92e236e9dd 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/FormattedMessageTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/FormattedMessageTest.java
@@ -16,6 +16,13 @@
  */
 package org.apache.logging.log4j.message;
 
+import org.apache.logging.log4j.test.junit.Mutable;
+import org.apache.logging.log4j.util3.Constants;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.parallel.ResourceAccessMode;
+import org.junit.jupiter.api.parallel.ResourceLock;
+import org.junit.jupiter.api.parallel.Resources;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -23,13 +30,6 @@ import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.util.Locale;
 
-import org.apache.logging.log4j.test.junit.Mutable;
-import org.apache.logging.log4j.util.Constants;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.parallel.ResourceAccessMode;
-import org.junit.jupiter.api.parallel.ResourceLock;
-import org.junit.jupiter.api.parallel.Resources;
-
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MessageFormatMessageTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MessageFormatMessageTest.java
index 1dfadbf502..561bcb833e 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MessageFormatMessageTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/message/MessageFormatMessageTest.java
@@ -18,7 +18,7 @@
 package org.apache.logging.log4j.message;
 
 import org.apache.logging.log4j.test.junit.Mutable;
-import org.apache.logging.log4j.util.Constants;
+import org.apache.logging.log4j.util3.Constants;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.parallel.ResourceAccessMode;
 import org.junit.jupiter.api.parallel.ResourceLock;
@@ -26,7 +26,8 @@ import org.junit.jupiter.api.parallel.Resources;
 
 import java.util.Locale;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 @ResourceLock(value = Resources.LOCALE, mode = ResourceAccessMode.READ)
 public class MessageFormatMessageTest {
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java
index 31030d3d75..27ba3a4742 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util/DeserializerHelper.java
@@ -16,6 +16,8 @@
  */
 package org.apache.logging.log4j.util;
 
+import org.apache.logging.log4j.util3.SortedArrayStringMapTest;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.ObjectInputStream;
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/CharsTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/CharsTest.java
similarity index 92%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/CharsTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/CharsTest.java
index df0255dd11..b9b7483e34 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/CharsTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/CharsTest.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -22,7 +22,8 @@ import org.junit.jupiter.params.provider.ValueSource;
 
 import java.util.stream.IntStream;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertAll;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class CharsTest {
     @ParameterizedTest
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/ClassLocator.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ClassLocator.java
similarity index 96%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/ClassLocator.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ClassLocator.java
index 9e94d0ab4c..f783a00778 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/ClassLocator.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ClassLocator.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 /**
  * Created by rgoers on 3/15/17.
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/ClassNameLocator.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ClassNameLocator.java
similarity index 96%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/ClassNameLocator.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ClassNameLocator.java
index 0a7d48fbc8..17b612a1a0 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/ClassNameLocator.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ClassNameLocator.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 /**
  *
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/ConstantsTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ConstantsTest.java
similarity index 92%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/ConstantsTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ConstantsTest.java
index 29a249f89c..1a52f3dc00 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/ConstantsTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ConstantsTest.java
@@ -14,11 +14,11 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class ConstantsTest {
 
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerIT.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/EnvironmentPropertySourceSecurityManagerIT.java
similarity index 98%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerIT.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/EnvironmentPropertySourceSecurityManagerIT.java
index eebb0a73aa..3b442dcf5b 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceSecurityManagerIT.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/EnvironmentPropertySourceSecurityManagerIT.java
@@ -15,7 +15,7 @@
  * limitations under the license.
  */
 
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledForJreRange;
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/EnvironmentPropertySourceTest.java
similarity index 95%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/EnvironmentPropertySourceTest.java
index 407915f517..48a6c736e7 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/EnvironmentPropertySourceTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/EnvironmentPropertySourceTest.java
@@ -14,15 +14,16 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
+
+import org.apache.logging.log4j.util.PropertySource;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.MethodSource;
-
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class EnvironmentPropertySourceTest {
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/LoaderUtilTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/LoaderUtilTest.java
similarity index 98%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/LoaderUtilTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/LoaderUtilTest.java
index 675c54f33e..fd4735e9b0 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/LoaderUtilTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/LoaderUtilTest.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/Log4jCharsetsPropertiesTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/Log4jCharsetsPropertiesTest.java
similarity index 97%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/Log4jCharsetsPropertiesTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/Log4jCharsetsPropertiesTest.java
index 5666fa321d..35ad8a116a 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/Log4jCharsetsPropertiesTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/Log4jCharsetsPropertiesTest.java
@@ -15,7 +15,7 @@
  * limitations under the license.
  */
 
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import org.junit.jupiter.api.Test;
 
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/PropertiesUtilOrderTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/PropertiesUtilOrderTest.java
similarity index 96%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/PropertiesUtilOrderTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/PropertiesUtilOrderTest.java
index 41336688c5..59e49260f5 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/PropertiesUtilOrderTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/PropertiesUtilOrderTest.java
@@ -15,27 +15,23 @@
  * limitations under the license.
  */
 
-package org.apache.logging.log4j.util;
-
-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.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.io.InputStream;
-import java.util.Properties;
+package org.apache.logging.log4j.util3;
 
+import org.apache.logging.log4j.util.PropertySource;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.parallel.ResourceLock;
 import org.junit.jupiter.api.parallel.Resources;
-
 import uk.org.webcompere.systemstubs.environment.EnvironmentVariables;
 import uk.org.webcompere.systemstubs.jupiter.SystemStubsExtension;
 import uk.org.webcompere.systemstubs.properties.SystemProperties;
 
+import java.io.InputStream;
+import java.util.Properties;
+
+import static org.junit.jupiter.api.Assertions.*;
+
 @ExtendWith(SystemStubsExtension.class)
 @ResourceLock(value = Resources.SYSTEM_PROPERTIES)
 public class PropertiesUtilOrderTest {
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/PropertiesUtilTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/PropertiesUtilTest.java
similarity index 96%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/PropertiesUtilTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/PropertiesUtilTest.java
index 05c19aaea8..1d078c3c64 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/PropertiesUtilTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/PropertiesUtilTest.java
@@ -15,17 +15,7 @@
  * limitations under the license.
  */
 
-package org.apache.logging.log4j.util;
-
-import static org.assertj.core.api.Assertions.assertThat;
-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 java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.Map;
-import java.util.Properties;
+package org.apache.logging.log4j.util3;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -34,6 +24,14 @@ import org.junit.jupiter.api.parallel.ResourceLock;
 import org.junit.jupiter.api.parallel.Resources;
 import org.junitpioneer.jupiter.ReadsSystemProperty;
 
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.*;
+
 public class PropertiesUtilTest {
 
     private final Properties properties = new Properties();
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/PropertyFilePropertySourceSecurityManagerIT.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/PropertyFilePropertySourceSecurityManagerIT.java
similarity index 96%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/PropertyFilePropertySourceSecurityManagerIT.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/PropertyFilePropertySourceSecurityManagerIT.java
index 40cdcb611f..41be31541a 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/PropertyFilePropertySourceSecurityManagerIT.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/PropertyFilePropertySourceSecurityManagerIT.java
@@ -15,8 +15,9 @@
  * limitations under the license.
  */
 
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
+import org.apache.logging.log4j.util.PropertyFilePropertySource;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledForJreRange;
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/ProviderUtilTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ProviderUtilTest.java
similarity index 97%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/ProviderUtilTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ProviderUtilTest.java
index 9db29e4c6a..d397dd6e60 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/ProviderUtilTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ProviderUtilTest.java
@@ -14,11 +14,11 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.test.TestLoggerContext;
 import org.apache.logging.log4j.spi.LoggerContext;
+import org.apache.logging.log4j.test.TestLoggerContext;
 import org.junit.jupiter.api.Test;
 
 import java.io.File;
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/ServiceLoaderUtilTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ServiceLoaderUtilTest.java
similarity index 96%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/ServiceLoaderUtilTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ServiceLoaderUtilTest.java
index a40121a6dd..365e0aa144 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/ServiceLoaderUtilTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/ServiceLoaderUtilTest.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j;
+package org.apache.logging.log4j.util3;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -28,7 +28,7 @@ import java.util.stream.Collectors;
 import org.apache.logging.log4j.test.BetterService;
 import org.apache.logging.log4j.test.Service;
 import org.apache.logging.log4j.util.PropertySource;
-import org.apache.logging.log4j.util.ServiceLoaderUtil;
+import org.apache.logging.log4j.util3.ServiceLoaderUtil;
 import org.junit.jupiter.api.Test;
 
 public class ServiceLoaderUtilTest {
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/SortedArrayStringMapTest.java
similarity index 99%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/SortedArrayStringMapTest.java
index 8e214fe70e..6a8a04e736 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/SortedArrayStringMapTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/SortedArrayStringMapTest.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import static org.junit.jupiter.api.Assertions.assertAll;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
@@ -44,6 +44,11 @@ import java.util.ConcurrentModificationException;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.logging.log4j.util.BiConsumer;
+import org.apache.logging.log4j.util.DeserializerHelper;
+import org.apache.logging.log4j.util.FilteredObjectInputStream;
+import org.apache.logging.log4j.util.TriConsumer;
+import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.junit.jupiter.api.Test;
 
 /**
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/StackLocatorUtilTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/StackLocatorUtilTest.java
similarity index 99%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/StackLocatorUtilTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/StackLocatorUtilTest.java
index 23ee4990c7..781e08318b 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/StackLocatorUtilTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/StackLocatorUtilTest.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/StringBuildersTest.java
similarity index 96%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/StringBuildersTest.java
index 606c8a4ed1..5cbe232a8a 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/StringBuildersTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/StringBuildersTest.java
@@ -14,8 +14,10 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
+import org.apache.logging.log4j.util3.Constants;
+import org.apache.logging.log4j.util3.StringBuilders;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.*;
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceSecurityManagerIT.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/SystemPropertiesPropertySourceSecurityManagerIT.java
similarity index 92%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceSecurityManagerIT.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/SystemPropertiesPropertySourceSecurityManagerIT.java
index d4df643cf2..c66ed6d4f1 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceSecurityManagerIT.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/SystemPropertiesPropertySourceSecurityManagerIT.java
@@ -15,8 +15,10 @@
  * limitations under the license.
  */
 
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
+import org.apache.logging.log4j.util3.PropertiesUtil;
+import org.apache.logging.log4j.util3.SystemPropertiesPropertySource;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledForJreRange;
 import org.junit.jupiter.api.condition.JRE;
@@ -70,7 +72,7 @@ public class SystemPropertiesPropertySourceSecurityManagerIT {
 	 * 	at org.apache.logging.log4j.util.SystemPropertiesPropertySourceSecurityManagerTest$TestSecurityManager.checkPermission(SystemPropertiesPropertySourceSecurityManagerTest.java:49)
 	 * 	at java.lang.SecurityManager.checkPropertiesAccess(SecurityManager.java:1265)
 	 * 	at java.lang.System.getProperties(System.java:624)
-	 * 	at org.apache.logging.log4j.util.SystemPropertiesPropertySource.forEach(SystemPropertiesPropertySource.java:40)
+	 * 	at org.apache.logging.log4j.util3.SystemPropertiesPropertySource.forEach(SystemPropertiesPropertySource.java:40)
 	 * 	at org.apache.logging.log4j.util.PropertiesUtil$Environment.reload(PropertiesUtil.java:330)
 	 * 	at org.apache.logging.log4j.util.PropertiesUtil$Environment.<init>(PropertiesUtil.java:322)
 	 * 	at org.apache.logging.log4j.util.PropertiesUtil$Environment.<init>(PropertiesUtil.java:310)
diff --git a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceTest.java b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/SystemPropertiesPropertySourceTest.java
similarity index 86%
rename from log4j-api-test/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceTest.java
rename to log4j-api-test/src/test/java/org/apache/logging/log4j/util3/SystemPropertiesPropertySourceTest.java
index bd06806b8a..78b35d7de2 100644
--- a/log4j-api-test/src/test/java/org/apache/logging/log4j/util/SystemPropertiesPropertySourceTest.java
+++ b/log4j-api-test/src/test/java/org/apache/logging/log4j/util3/SystemPropertiesPropertySourceTest.java
@@ -15,8 +15,9 @@
  * limitations under the license.
  */
 
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
+import org.apache.logging.log4j.util3.SystemPropertiesPropertySource;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.junitpioneer.jupiter.WritesSystemProperty;
@@ -42,8 +43,8 @@ public class SystemPropertiesPropertySourceTest {
      * <pre>
      * java.util.ConcurrentModificationException
      *  at java.util.Hashtable$Enumerator.next(Hashtable.java:1167)
-     *  at org.apache.logging.log4j.util.SystemPropertiesPropertySource.forEach(SystemPropertiesPropertySource.java:38)
-     *  at org.apache.logging.log4j.util.SystemPropertiesPropertySourceTest.testMultiThreadedAccess(SystemPropertiesPropertySourceTest.java:47)
+     *  at org.apache.logging.log4j.util3.SystemPropertiesPropertySource.forEach(SystemPropertiesPropertySource.java:38)
+     *  at org.apache.logging.log4j.util3.SystemPropertiesPropertySourceTest.testMultiThreadedAccess(SystemPropertiesPropertySourceTest.java:47)
      * </pre>
      * @throws InterruptedException 
      * @throws ExecutionException 
diff --git a/log4j-api/pom.xml b/log4j-api/pom.xml
index 05859be43b..2c42386cbe 100644
--- a/log4j-api/pom.xml
+++ b/log4j-api/pom.xml
@@ -56,7 +56,7 @@
               sun.reflect;resolution:=optional,
               *
             </Import-Package>
-            <Bundle-Activator>org.apache.logging.log4j.util.Activator</Bundle-Activator>
+            <Bundle-Activator>org.apache.logging.log4j.util3.Activator</Bundle-Activator>
             <_fixupmessages>"Classes found in the wrong directory";is:=warning</_fixupmessages>
           </instructions>
         </configuration>
diff --git a/log4j-api/revapi.json b/log4j-api/revapi.json
index 06bc470f7b..47cf189030 100644
--- a/log4j-api/revapi.json
+++ b/log4j-api/revapi.json
@@ -11,7 +11,8 @@
             "org\\.apache\\.logging\\.log4j\\.util\\.PropertiesUtil",
             "org\\.apache\\.logging\\.log4j\\.util\\.ProviderUtil",
             "org\\.apache\\.logging\\.log4j\\.util\\.StackLocator",
-            "org\\.apache\\.logging\\.log4j\\.util\\.StackLocatorUtil"
+            "org\\.apache\\.logging\\.log4j\\.util\\.StackLocatorUtil",
+            "org\\.apache\\.logging\\.log4j\\.util3\\..*"
           ]
         }
       }
diff --git a/log4j-api/src/main/java/module-info.java b/log4j-api/src/main/java/module-info.java
index 75a4c92ddc..b294bde1c3 100644
--- a/log4j-api/src/main/java/module-info.java
+++ b/log4j-api/src/main/java/module-info.java
@@ -15,6 +15,10 @@
  * limitations under the license.
  */
 
+import org.apache.logging.log4j.util.PropertySource;
+import org.apache.logging.log4j.util3.EnvironmentPropertySource;
+import org.apache.logging.log4j.util3.SystemPropertiesPropertySource;
+
 /**
  * <p>Log4j public API for libraries and applications. This module is provided as a portable
  * {@linkplain org.apache.logging.log4j.Logger logging API} which supports independent
@@ -33,11 +37,22 @@ module org.apache.logging.log4j {
     exports org.apache.logging.log4j.spi;
     exports org.apache.logging.log4j.status;
     exports org.apache.logging.log4j.util;
+    exports org.apache.logging.log4j.util3 to
+            org.apache.logging.log4j.plugin.processor,
+            org.apache.logging.log4j.plugins,
+            org.apache.logging.log4j.core,
+            org.apache.logging.log4j.test,
+            org.apache.logging.log4j.core.test,
+            org.apache.logging.log4j.jpl,
+            org.apache.logging.log4j.jul,
+            org.apache.logging.log4j.tojul,
+            org.apache.logging.log4j.layout.template.json,
+            org.apache.logging.log4j.script;
 
     requires static org.osgi.framework;
     uses org.apache.logging.log4j.spi.Provider;
-    uses org.apache.logging.log4j.util.PropertySource;
+    uses PropertySource;
     uses org.apache.logging.log4j.message.ThreadDumpMessage.ThreadInfoFactory;
-    provides org.apache.logging.log4j.util.PropertySource with org.apache.logging.log4j.util.EnvironmentPropertySource,
-        org.apache.logging.log4j.util.SystemPropertiesPropertySource;
+
+    provides PropertySource with EnvironmentPropertySource, SystemPropertiesPropertySource;
 }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
index b3fcb51f18..498733f5ab 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
@@ -26,12 +26,12 @@ import org.apache.logging.log4j.spi.Provider;
 import org.apache.logging.log4j.spi.Terminable;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Lazy;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
-import org.apache.logging.log4j.util.ProviderUtil;
-import org.apache.logging.log4j.util.StackLocatorUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.LoaderUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+import org.apache.logging.log4j.util3.ProviderUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 import java.net.URI;
 import java.util.Map;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java b/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
index 72164008de..d96a08abc7 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
@@ -16,13 +16,13 @@
  */
 package org.apache.logging.log4j;
 
+import org.apache.logging.log4j.util.StringBuilderFormattable;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+
 import java.util.Arrays;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.StringBuilderFormattable;
-
 /**
  * Applications create Markers by using the Marker Manager. All Markers created by this Manager are immutable.
  */
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java b/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java
index c61ca0701c..b03a1f3d17 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java
@@ -27,7 +27,7 @@ import org.apache.logging.log4j.spi.ThreadContextMap;
 import org.apache.logging.log4j.spi.ThreadContextMap2;
 import org.apache.logging.log4j.spi.ThreadContextMapFactory;
 import org.apache.logging.log4j.spi.ThreadContextStack;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 
 import java.io.Serializable;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/internal/DefaultLogBuilder.java b/log4j-api/src/main/java/org/apache/logging/log4j/internal/DefaultLogBuilder.java
index 75915c52ee..3e59fa9ce4 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/internal/DefaultLogBuilder.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/internal/DefaultLogBuilder.java
@@ -25,9 +25,9 @@ import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.LambdaUtil;
-import org.apache.logging.log4j.util.StackLocatorUtil;
 import org.apache.logging.log4j.util.Strings;
 import org.apache.logging.log4j.util.Supplier;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 
 /**
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/BasicThreadInformation.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/BasicThreadInformation.java
index 9f2ed3d75a..209bc677ff 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/BasicThreadInformation.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/BasicThreadInformation.java
@@ -16,8 +16,8 @@
  */
 package org.apache.logging.log4j.message;
 
-import org.apache.logging.log4j.util.Chars;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.Chars;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 /**
  * Generates information about the current Thread. Used internally by ThreadDumpMessage.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
index ccd5895e90..82a68cd97f 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
@@ -16,23 +16,23 @@
  */
 package org.apache.logging.log4j.message;
 
-import java.util.AbstractMap;
-import java.util.Collections;
-import java.util.Map;
-import java.util.TreeMap;
-
 import org.apache.logging.log4j.util.BiConsumer;
-import org.apache.logging.log4j.util.Chars;
-import org.apache.logging.log4j.util.EnglishEnums;
 import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
 import org.apache.logging.log4j.util.IndexedStringMap;
 import org.apache.logging.log4j.util.MultiFormatStringBuilderFormattable;
-import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
-import org.apache.logging.log4j.util.StringBuilders;
 import org.apache.logging.log4j.util.Strings;
 import org.apache.logging.log4j.util.TriConsumer;
+import org.apache.logging.log4j.util3.Chars;
+import org.apache.logging.log4j.util3.EnglishEnums;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.StringBuilders;
+
+import java.util.AbstractMap;
+import java.util.Collections;
+import java.util.Map;
+import java.util.TreeMap;
 
 /**
  * Represents a Message that consists of a Map.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessageJsonFormatter.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessageJsonFormatter.java
index 3887f9767a..5237dd728a 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessageJsonFormatter.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessageJsonFormatter.java
@@ -17,9 +17,9 @@
 package org.apache.logging.log4j.message;
 
 import org.apache.logging.log4j.util.IndexedStringMap;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.math.BigDecimal;
 import java.util.Collection;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java
index ecd874ce63..e8a0648db2 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java
@@ -16,14 +16,14 @@
  */
 package org.apache.logging.log4j.message;
 
+import org.apache.logging.log4j.util.StringBuilderFormattable;
+import org.apache.logging.log4j.util3.StringBuilders;
+
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
 
-import org.apache.logging.log4j.util.StringBuilderFormattable;
-import org.apache.logging.log4j.util.StringBuilders;
-
 /**
  * Handles messages that contain an Object.
  */
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java
index b424ee71af..64c1e98a91 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java
@@ -16,6 +16,8 @@
  */
 package org.apache.logging.log4j.message;
 
+import org.apache.logging.log4j.util3.StringBuilders;
+
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
@@ -26,8 +28,6 @@ import java.util.IdentityHashMap;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.logging.log4j.util.StringBuilders;
-
 /**
  * Supports parameter formatting as used in ParameterizedMessage and ReusableParameterizedMessage.
  */
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterVisitable.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterVisitable.java
index d196e31e64..7765589496 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterVisitable.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterVisitable.java
@@ -16,7 +16,7 @@
  */
 package org.apache.logging.log4j.message;
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Allows message parameters to be iterated over without any allocation
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
index 9ab84a47f1..89c6898773 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java
@@ -16,11 +16,11 @@
  */
 package org.apache.logging.log4j.message;
 
-import java.util.Arrays;
-
-import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.Constants;
+import org.apache.logging.log4j.util3.StringBuilders;
+
+import java.util.Arrays;
 
 /**
  * Handles messages that consist of a format string containing '{}' to represent each replaceable token, and
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessage.java
index f1ab320b0a..ee306e6124 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessage.java
@@ -16,7 +16,7 @@
  */
 package org.apache.logging.log4j.message;
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
 
 /**
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
index d7d7b8cf56..366cc9d59c 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableMessageFactory.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.message;
 
 import java.io.Serializable;
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Implementation of the {@link MessageFactory} interface that avoids allocating temporary objects where possible.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
index 9144223b21..47ae534ec9 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
@@ -16,8 +16,8 @@
  */
 package org.apache.logging.log4j.message;
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 /**
  * Mutable Message wrapper around an Object message.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
index be3db8f9a6..0ff96be65c 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableParameterizedMessage.java
@@ -18,9 +18,9 @@ package org.apache.logging.log4j.message;
 
 import java.util.Arrays;
 
-import org.apache.logging.log4j.util.Constants;
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.Constants;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 /**
  * Reusable parameterized message. This message is mutable and is not safe to be accessed or modified by multiple
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
index 97af509a31..d08a884abe 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableSimpleMessage.java
@@ -16,7 +16,7 @@
  */
 package org.apache.logging.log4j.message;
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Mutable Message wrapper around a String message.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/StringMapMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/StringMapMessage.java
index 9d05ce05b3..42409ec34d 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/StringMapMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/StringMapMessage.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.message;
 
 import java.util.Map;
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * A {@link StringMapMessage} typed to {@link String}-only values. This is like the MapMessage class before 2.9.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
index a2ba89a96a..85ec44b1c2 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
@@ -19,8 +19,8 @@ package org.apache.logging.log4j.message;
 
 import java.util.Map;
 
-import org.apache.logging.log4j.util.EnglishEnums;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.EnglishEnums;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 /**
  * Represents a Message that conforms to an RFC 5424 StructuredData element along with the syslog message.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java
index 2bf80736a1..ee6bb7d7f7 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java
@@ -17,7 +17,7 @@
 package org.apache.logging.log4j.message;
 
 import org.apache.logging.log4j.util.Lazy;
-import org.apache.logging.log4j.util.ServiceRegistry;
+import org.apache.logging.log4j.util3.ServiceRegistry;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
 import org.apache.logging.log4j.util.Strings;
 
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContext.java b/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContext.java
index b83ed480a2..aeab1f1459 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContext.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContext.java
@@ -22,7 +22,7 @@ import org.apache.logging.log4j.spi.AbstractLogger;
 import org.apache.logging.log4j.spi.ExtendedLogger;
 import org.apache.logging.log4j.spi.LoggerContext;
 import org.apache.logging.log4j.spi.LoggerRegistry;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 
 import java.io.FileNotFoundException;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java
index 93bbc5936a..1e7ab988c0 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLogger.java
@@ -33,15 +33,15 @@ import org.apache.logging.log4j.message.ReusableMessageFactory;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.message.StringFormattedMessage;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.LambdaUtil;
-import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.MessageSupplier;
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.PropertiesUtil;
-import org.apache.logging.log4j.util.StackLocatorUtil;
 import org.apache.logging.log4j.util.Strings;
 import org.apache.logging.log4j.util.Supplier;
+import org.apache.logging.log4j.util3.Constants;
+import org.apache.logging.log4j.util3.LoaderUtil;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 import java.io.IOException;
 import java.io.ObjectInputStream;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerAdapter.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerAdapter.java
index 2434955c90..7e59b64189 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerAdapter.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/AbstractLoggerAdapter.java
@@ -17,7 +17,7 @@
 package org.apache.logging.log4j.spi;
 
 import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 import java.util.HashSet;
 import java.util.Map;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
index 4c291d830e..7b9ad8a76d 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
@@ -18,11 +18,11 @@ package org.apache.logging.log4j.spi;
 
 import org.apache.logging.log4j.util.LazyBoolean;
 import org.apache.logging.log4j.util.LazyInt;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringMap;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.util.Collections;
 import java.util.HashMap;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
index 7865fef75a..c5bb0e2e24 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
@@ -18,10 +18,10 @@ package org.apache.logging.log4j.spi;
 
 import org.apache.logging.log4j.util.BiConsumer;
 import org.apache.logging.log4j.util.LazyBoolean;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.TriConsumer;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.util.Collections;
 import java.util.HashMap;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java
index cdbc4df1b4..e54d990cf5 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextStack.java
@@ -16,16 +16,16 @@
  */
 package org.apache.logging.log4j.spi;
 
+import org.apache.logging.log4j.ThreadContext.ContextStack;
+import org.apache.logging.log4j.util.StringBuilderFormattable;
+import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.StringBuilders;
+
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
-import org.apache.logging.log4j.ThreadContext.ContextStack;
-import org.apache.logging.log4j.util.StringBuilderFormattable;
-import org.apache.logging.log4j.util.StringBuilders;
-import org.apache.logging.log4j.util.Strings;
-
 /**
  * A copy-on-write thread-safe variant of {@code org.apache.logging.log4j.spi.ThreadContextStack} in which all mutative
  * operations (add, pop, and so on) are implemented by making a fresh copy of the underlying list.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLoggerWrapper.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLoggerWrapper.java
index 6c9c6c9a8c..440b82b101 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLoggerWrapper.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ExtendedLoggerWrapper.java
@@ -20,7 +20,7 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.MessageFactory;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 /**
  * Wrapper class that exposes the protected AbstractLogger methods to support wrapped loggers.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
index 108a12a8c6..2cba6d3ad0 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
@@ -18,11 +18,11 @@ package org.apache.logging.log4j.spi;
 
 import org.apache.logging.log4j.util.LazyBoolean;
 import org.apache.logging.log4j.util.LazyInt;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringMap;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.util.Collections;
 import java.util.HashMap;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java
index a6f07cc5e0..cb341640b9 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java
@@ -20,10 +20,10 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.Constants;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.Constants;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
-import org.apache.logging.log4j.util.ProviderUtil;
+import org.apache.logging.log4j.util3.ProviderUtil;
 import org.apache.logging.log4j.util.ReflectionUtil;
 
 /**
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java
index 469610d7e8..09e1244622 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusData.java
@@ -25,7 +25,7 @@ import java.util.Date;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.message.Message;
 
-import static org.apache.logging.log4j.util.Chars.*;
+import static org.apache.logging.log4j.util3.Chars.*;
 
 /**
  * The Status data.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
index 92e94f9d80..19e6601467 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
@@ -24,8 +24,8 @@ import org.apache.logging.log4j.message.ParameterizedNoReferenceMessageFactory;
 import org.apache.logging.log4j.simple.SimpleLogger;
 import org.apache.logging.log4j.simple.SimpleLoggerContext;
 import org.apache.logging.log4j.spi.AbstractLogger;
-import org.apache.logging.log4j.util.Constants;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.Constants;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.Strings;
 
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
index 354edfbffe..fb80a4748d 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
@@ -14,422 +14,39 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.invoke.MethodHandles;
-import java.time.Duration;
-import java.time.temporal.ChronoUnit;
-import java.time.temporal.TemporalUnit;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Properties;
-import java.util.ResourceBundle;
-import java.util.ServiceLoader;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentSkipListSet;
+package org.apache.logging.log4j.util;
 
 /**
- * <em>Consider this class private.</em>
- * <p>
- * Provides utility methods for managing {@link Properties} instances as well as access to the global configuration
- * system. Properties by default are loaded from the system properties, system environment, and a classpath resource
- * file named {@value #LOG4J_PROPERTIES_FILE_NAME}. Additional properties can be loaded by implementing a custom
- * {@link PropertySource} service and specifying it via a {@link ServiceLoader} file called
- * {@code META-INF/services/org.apache.logging.log4j.util.PropertySource} with a list of fully qualified class names
- * implementing that interface.
- * </p>
+ * Provided for backward compatibility with plugins directly referencing this class.
  *
- * @see PropertySource
+ * @deprecated use {@link PropertyEnvironment} for API and {@link org.apache.logging.log4j.util3.PropertiesUtil} for
+ * internal usage.
  */
-public final class PropertiesUtil implements PropertyEnvironment {
-
-    private static final String LOG4J_PROPERTIES_FILE_NAME = "log4j2.component.properties";
-    private static final String LOG4J_SYSTEM_PROPERTIES_FILE_NAME = "log4j2.system.properties";
-    private static final Lazy<PropertiesUtil> COMPONENT_PROPERTIES =
-            Lazy.lazy(() -> new PropertiesUtil(LOG4J_PROPERTIES_FILE_NAME));
-
-    private final Environment environment;
-
-    /**
-     * Constructs a PropertiesUtil using a given Properties object as its source of defined properties.
-     *
-     * @param props the Properties to use by default
-     */
-    public PropertiesUtil(final Properties props) {
-        this(new PropertiesPropertySource(props));
-    }
-
-    /**
-     * Constructs a PropertiesUtil for a given properties file name on the classpath. The properties specified in this
-     * file are used by default. If a property is not defined in this file, then the equivalent system property is used.
-     *
-     * @param propertiesFileName the location of properties file to load
-     */
-    public PropertiesUtil(final String propertiesFileName) {
-        this(propertiesFileName, true);
-    }
-
-    private PropertiesUtil(final String propertiesFileName, final boolean useTccl) {
-        this.environment = new Environment(new PropertyFilePropertySource(propertiesFileName, useTccl));
-    }
-
-    /**
-     * Constructs a PropertiesUtil for a give property source as source of additional properties.
-     * @param source a property source
-     */
-    PropertiesUtil(final PropertySource source) {
-        this.environment = new Environment(source);
-    }
+@Deprecated(since = "3.0.0", forRemoval = true)
+public class PropertiesUtil implements PropertyEnvironment {
 
-    /**
-     * Loads and closes the given property input stream. If an error occurs, log to the status logger.
-     *
-     * @param in     a property input stream.
-     * @param source a source object describing the source, like a resource string or a URL.
-     * @return a new Properties object
-     */
-    static Properties loadClose(final InputStream in, final Object source) {
-        final Properties props = new Properties();
-        if (null != in) {
-            try {
-                props.load(in);
-            } catch (final IOException e) {
-                LowLevelLogUtil.logException("Unable to read " + source, e);
-            } finally {
-                try {
-                    in.close();
-                } catch (final IOException e) {
-                    LowLevelLogUtil.logException("Unable to close " + source, e);
-                }
-            }
-        }
-        return props;
+    public static PropertiesUtil getProperties() {
+        return new PropertiesUtil(org.apache.logging.log4j.util3.PropertiesUtil.getProperties());
     }
+    private final PropertyEnvironment delegate;
 
-    /**
-     * Returns the PropertiesUtil used by Log4j.
-     *
-     * @return the main Log4j PropertiesUtil instance.
-     */
-    public static PropertyEnvironment getProperties() {
-        return COMPONENT_PROPERTIES.value();
-    }
-
-    public static PropertyEnvironment getProperties(final String namespace) {
-        return new Environment(new PropertyFilePropertySource(String.format("log4j2.%s.properties", namespace)));
+    public PropertiesUtil(final PropertyEnvironment delegate) {
+        this.delegate = delegate;
     }
 
     @Override
-    public void addPropertySource(PropertySource propertySource) {
-        if (environment != null) {
-            environment.addPropertySource(propertySource);
-        }
+    public void addPropertySource(final PropertySource propertySource) {
+        delegate.addPropertySource(propertySource);
     }
 
-    /**
-     * Returns {@code true} if the specified property is defined, regardless of its value (it may not have a value).
-     *
-     * @param name the name of the property to verify
-     * @return {@code true} if the specified property is defined, regardless of its value
-     */
     @Override
     public boolean hasProperty(final String name) {
-        return environment.hasProperty(name);
-    }
-
-    /**
-     * Gets the named property as a double.
-     *
-     * @param name         the name of the property to look up
-     * @param defaultValue the default value to use if the property is undefined
-     * @return the parsed double value of the property or {@code defaultValue} if it was undefined or could not be parsed.
-     */
-    public double getDoubleProperty(final String name, final double defaultValue) {
-        final String prop = getStringProperty(name);
-        if (prop != null) {
-            try {
-                return Double.parseDouble(prop);
-            } catch (final Exception ignored) {
-                return defaultValue;
-            }
-        }
-        return defaultValue;
+        return delegate.hasProperty(name);
     }
 
-    /**
-     * Gets the named property as a String.
-     *
-     * @param name the name of the property to look up
-     * @return the String value of the property or {@code null} if undefined.
-     */
     @Override
     public String getStringProperty(final String name) {
-        return environment.getStringProperty(name);
-    }
-
-    /**
-     * Return the system properties or an empty Properties object if an error occurs.
-     *
-     * @return The system properties.
-     */
-    public static Properties getSystemProperties() {
-        try {
-            return new Properties(System.getProperties());
-        } catch (final SecurityException ex) {
-            LowLevelLogUtil.logException("Unable to access system properties.", ex);
-            // Sandboxed - can't read System Properties
-            return new Properties();
-        }
-    }
-
-    /**
-     * Reloads all properties. This is primarily useful for unit tests.
-     *
-     * @since 2.10.0
-     */
-    public void reload() {
-        environment.reload();
-    }
-
-    /**
-     * Provides support for looking up global configuration properties via environment variables, property files,
-     * and system properties, in three variations:
-     * <p>
-     * Normalized: all log4j-related prefixes removed, remaining property is camelCased with a log4j2 prefix for
-     * property files and system properties, or follows a LOG4J_FOO_BAR format for environment variables.
-     * <p>
-     * Legacy: the original property name as defined in the source pre-2.10.0.
-     * <p>
-     * Tokenized: loose matching based on word boundaries.
-     *
-     * @since 2.10.0
-     */
-    private static class Environment implements PropertyEnvironment {
-
-        private final Set<PropertySource> sources = new ConcurrentSkipListSet<>(new PropertySource.Comparator());
-        /**
-         * Maps a key to its value in the lowest priority source that contains it.
-         */
-        private final Map<String, String> literal = new ConcurrentHashMap<>();
-        /**
-         * Maps a key to the value associated to its normalization in the lowest
-         * priority source that contains it.
-         */
-        private final Map<String, String> normalized = new ConcurrentHashMap<>();
-        private final Map<List<CharSequence>, String> tokenized = new ConcurrentHashMap<>();
-
-        private Environment(final PropertySource propertySource) {
-            final PropertyFilePropertySource sysProps = new PropertyFilePropertySource(LOG4J_SYSTEM_PROPERTIES_FILE_NAME);
-            try {
-                sysProps.forEach((key, value) -> {
-                    if (System.getProperty(key) == null) {
-                        System.setProperty(key, value);
-                    }
-                });
-            } catch (final SecurityException ex) {
-                // Access to System Properties is restricted so just skip it.
-            }
-            sources.add(propertySource);
-            final ServiceRegistry registry = ServiceRegistry.getInstance();
-            sources.addAll(registry.getServices(PropertySource.class, MethodHandles.lookup(), null));
-            reload();
-        }
-
-        @Override
-        public void addPropertySource(final PropertySource propertySource) {
-            sources.add(propertySource);
-        }
-
-        private synchronized void reload() {
-            literal.clear();
-            normalized.clear();
-            tokenized.clear();
-            // 1. Collects all property keys from enumerable sources.
-            final Set<String> keys = new HashSet<>();
-            sources.stream()
-                   .map(PropertySource::getPropertyNames)
-                   .forEach(keys::addAll);
-            // 2. Fills the property caches. Sources with higher priority values don't override the previous ones.
-            keys.stream()
-                .filter(Objects::nonNull)
-                .forEach(key -> {
-                    final List<CharSequence> tokens = PropertySource.Util.tokenize(key);
-                    final boolean hasTokens = !tokens.isEmpty();
-                    sources.forEach(source -> {
-                        if (source.containsProperty(key)) {
-                            final String value = source.getProperty(key);
-                            literal.putIfAbsent(key, value);
-                            if (hasTokens) {
-                                tokenized.putIfAbsent(tokens, value);
-                            }
-                        }
-                        if (hasTokens) {
-                            final String normalKey = Objects.toString(source.getNormalForm(tokens), null);
-                            if (normalKey != null && source.containsProperty(normalKey)) {
-                                normalized.putIfAbsent(key, source.getProperty(normalKey));
-                            }
-                        }
-                    });
-                });
-        }
-
-        @Override
-        public String getStringProperty(final String key) {
-            if (normalized.containsKey(key)) {
-                return normalized.get(key);
-            }
-            if (literal.containsKey(key)) {
-                return literal.get(key);
-            }
-            final List<CharSequence> tokens = PropertySource.Util.tokenize(key);
-            final boolean hasTokens = !tokens.isEmpty();
-            for (final PropertySource source : sources) {
-                if (hasTokens) {
-                    final String normalKey = Objects.toString(source.getNormalForm(tokens), null);
-                    if (normalKey != null && source.containsProperty(normalKey)) {
-                        return source.getProperty(normalKey);
-                    }
-                }
-                if (source.containsProperty(key)) {
-                    return source.getProperty(key);
-                }
-            }
-            return tokenized.get(tokens);
-        }
-
-        @Override
-        public boolean hasProperty(final String key) {
-            List<CharSequence> tokens = PropertySource.Util.tokenize(key);
-            return normalized.containsKey(key) ||
-                   literal.containsKey(key) ||
-                   tokenized.containsKey(tokens) ||
-                   sources.stream().anyMatch(s -> {
-                        final CharSequence normalizedKey = s.getNormalForm(tokens);
-                        return s.containsProperty(key) || normalizedKey != null && s.containsProperty(normalizedKey.toString());
-                   });
-        }
-    }
-
-    /**
-     * Extracts properties that start with or are equals to the specific prefix and returns them in a new Properties
-     * object with the prefix removed.
-     *
-     * @param properties The Properties to evaluate.
-     * @param prefix     The prefix to extract.
-     * @return The subset of properties.
-     */
-    public static Properties extractSubset(final Properties properties, final String prefix) {
-        final Properties subset = new Properties();
-
-        if (prefix == null || prefix.length() == 0) {
-            return subset;
-        }
-
-        final String prefixToMatch = prefix.charAt(prefix.length() - 1) != '.' ? prefix + '.' : prefix;
-
-        final List<String> keys = new ArrayList<>();
-
-        for (final String key : properties.stringPropertyNames()) {
-            if (key.startsWith(prefixToMatch)) {
-                subset.setProperty(key.substring(prefixToMatch.length()), properties.getProperty(key));
-                keys.add(key);
-            }
-        }
-        for (final String key : keys) {
-            properties.remove(key);
-        }
-
-        return subset;
-    }
-
-    static ResourceBundle getCharsetsResourceBundle() {
-        return ResourceBundle.getBundle("Log4j-charsets");
-    }
-
-    /**
-     * Partitions a properties map based on common key prefixes up to the first period.
-     *
-     * @param properties properties to partition
-     * @return the partitioned properties where each key is the common prefix (minus the period) and the values are
-     * new property maps without the prefix and period in the key
-     * @since 2.6
-     */
-    public static Map<String, Properties> partitionOnCommonPrefixes(final Properties properties) {
-        return partitionOnCommonPrefixes(properties, false);
-    }
-
-    /**
-     * Partitions a properties map based on common key prefixes up to the first period.
-     *
-     * @param properties properties to partition
-     * @param includeBaseKey when true if a key exists with no '.' the key will be included.
-     * @return the partitioned properties where each key is the common prefix (minus the period) and the values are
-     * new property maps without the prefix and period in the key
-     * @since 2.17.2
-     */
-    public static Map<String, Properties> partitionOnCommonPrefixes(final Properties properties,
-            final boolean includeBaseKey) {
-        final Map<String, Properties> parts = new ConcurrentHashMap<>();
-        for (final String key : properties.stringPropertyNames()) {
-            final int idx = key.indexOf('.');
-            if (idx < 0) {
-                if (includeBaseKey) {
-                    if (!parts.containsKey(key)) {
-                        parts.put(key, new Properties());
-                    }
-                    parts.get(key).setProperty("", properties.getProperty(key));
-                }
-                continue;
-            }
-            final String prefix = key.substring(0, idx);
-            if (!parts.containsKey(prefix)) {
-                parts.put(prefix, new Properties());
-            }
-            parts.get(prefix).setProperty(key.substring(idx + 1), properties.getProperty(key));
-        }
-        return parts;
-    }
-
-    enum TimeUnit {
-        NANOS("ns,nano,nanos,nanosecond,nanoseconds", ChronoUnit.NANOS),
-        MICROS("us,micro,micros,microsecond,microseconds", ChronoUnit.MICROS),
-        MILLIS("ms,milli,millis,millsecond,milliseconds", ChronoUnit.MILLIS),
-        SECONDS("s,second,seconds", ChronoUnit.SECONDS),
-        MINUTES("m,minute,minutes", ChronoUnit.MINUTES),
-        HOURS("h,hour,hours", ChronoUnit.HOURS),
-        DAYS("d,day,days", ChronoUnit.DAYS);
-
-        private final String[] descriptions;
-        private final ChronoUnit timeUnit;
-
-        TimeUnit(final String descriptions, final ChronoUnit timeUnit) {
-            this.descriptions = descriptions.split(",");
-            this.timeUnit = timeUnit;
-        }
-
-        ChronoUnit getTimeUnit() {
-            return this.timeUnit;
-        }
-
-        static Duration getDuration(final String time) {
-            final String value = time.trim();
-            TemporalUnit temporalUnit = ChronoUnit.MILLIS;
-            long timeVal = 0;
-            for (final TimeUnit timeUnit : values()) {
-                for (final String suffix : timeUnit.descriptions) {
-                    if (value.endsWith(suffix)) {
-                        temporalUnit = timeUnit.timeUnit;
-                        timeVal = Long.parseLong(value.substring(0, value.length() - suffix.length()));
-                    }
-                }
-            }
-            return Duration.of(timeVal, temporalUnit);
-        }
+        return delegate.getStringProperty(name);
     }
 }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyEnvironment.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyEnvironment.java
index 910906fde9..eca12fe77b 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyEnvironment.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyEnvironment.java
@@ -17,6 +17,9 @@
 
 package org.apache.logging.log4j.util;
 
+import org.apache.logging.log4j.util3.LowLevelLogUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+
 import java.nio.charset.Charset;
 import java.time.Duration;
 import java.util.ResourceBundle;
@@ -218,7 +221,7 @@ public interface PropertyEnvironment {
     default Duration getDurationProperty(String name, Duration defaultValue) {
         final String prop = getStringProperty(name);
         if (prop != null) {
-            return PropertiesUtil.TimeUnit.getDuration(prop);
+            return TimeUnit.getDuration(prop);
         }
         return defaultValue;
     }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyFilePropertySource.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyFilePropertySource.java
index 318011524a..9ee684953c 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyFilePropertySource.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyFilePropertySource.java
@@ -16,6 +16,9 @@
  */
 package org.apache.logging.log4j.util;
 
+import org.apache.logging.log4j.util3.LoaderUtil;
+import org.apache.logging.log4j.util3.LowLevelLogUtil;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
index 174cd618e1..cc6d38835b 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Strings.java
@@ -16,6 +16,9 @@
  */
 package org.apache.logging.log4j.util;
 
+import org.apache.logging.log4j.util3.Chars;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+
 import java.util.Iterator;
 import java.util.Locale;
 import java.util.Objects;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/TimeUnit.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/TimeUnit.java
new file mode 100644
index 0000000000..9ef3a73207
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/TimeUnit.java
@@ -0,0 +1,59 @@
+/*
+ * 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.logging.log4j.util;
+
+import java.time.Duration;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalUnit;
+
+enum TimeUnit {
+    NANOS("ns,nano,nanos,nanosecond,nanoseconds", ChronoUnit.NANOS),
+    MICROS("us,micro,micros,microsecond,microseconds", ChronoUnit.MICROS),
+    MILLIS("ms,milli,millis,millsecond,milliseconds", ChronoUnit.MILLIS),
+    SECONDS("s,second,seconds", ChronoUnit.SECONDS),
+    MINUTES("m,minute,minutes", ChronoUnit.MINUTES),
+    HOURS("h,hour,hours", ChronoUnit.HOURS),
+    DAYS("d,day,days", ChronoUnit.DAYS);
+
+    private final String[] descriptions;
+    private final ChronoUnit timeUnit;
+
+    TimeUnit(final String descriptions, final ChronoUnit timeUnit) {
+        this.descriptions = descriptions.split(",");
+        this.timeUnit = timeUnit;
+    }
+
+    ChronoUnit getTimeUnit() {
+        return this.timeUnit;
+    }
+
+    static Duration getDuration(final String time) {
+        final String value = time.trim();
+        TemporalUnit temporalUnit = ChronoUnit.MILLIS;
+        long timeVal = 0;
+        for (final TimeUnit timeUnit : values()) {
+            for (final String suffix : timeUnit.descriptions) {
+                if (value.endsWith(suffix)) {
+                    temporalUnit = timeUnit.timeUnit;
+                    timeVal = Long.parseLong(value.substring(0, value.length() - suffix.length()));
+                }
+            }
+        }
+        return Duration.of(timeVal, temporalUnit);
+    }
+}
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Unbox.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/Unbox.java
index adad8a4947..5aaedc1c7e 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Unbox.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/Unbox.java
@@ -18,6 +18,9 @@ package org.apache.logging.log4j.util;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util3.Constants;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Utility for preventing primitive parameter values from being auto-boxed. Auto-boxing creates temporary objects
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/package-info.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/package-info.java
index a98f9bcb7c..f6d67ac8b7 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/package-info.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/package-info.java
@@ -16,7 +16,6 @@
  */
 
 /**
- * Internal utility classes for the Log4j 2 API. Note that the use of any classes in this package is not supported.
- * There are no guarantees for binary or logical compatibility in this package.
+ * Utility APIs used elsewhere in Log4j API.
  */
 package org.apache.logging.log4j.util;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/Activator.java
similarity index 99%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/Activator.java
index 51b985cc3b..1c2f5e5dfe 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Activator.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/Activator.java
@@ -14,12 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
-
-import java.net.URL;
-import java.security.Permission;
-import java.util.Collection;
-import java.util.List;
+package org.apache.logging.log4j.util3;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.spi.LoggerContextFactory;
@@ -37,6 +32,11 @@ import org.osgi.framework.SynchronousBundleListener;
 import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
 
+import java.net.URL;
+import java.security.Permission;
+import java.util.Collection;
+import java.util.List;
+
 /**
  * <em>Consider this class private.</em>
  * OSGi bundle activator. Used for locating an implementation of
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Chars.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/Chars.java
similarity index 98%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/Chars.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/Chars.java
index 996a5b13f5..c958f17321 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Chars.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/Chars.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 /**
  * <em>Consider this class private.</em>
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/Constants.java
similarity index 98%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/Constants.java
index 8f66492821..da5aca343e 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/Constants.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/Constants.java
@@ -14,7 +14,9 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
+
+import org.apache.logging.log4j.util.LazyBoolean;
 
 /**
  * Log4j API Constants.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/EnglishEnums.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/EnglishEnums.java
similarity index 98%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/EnglishEnums.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/EnglishEnums.java
index be6b346dae..cf6cbf45ee 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/EnglishEnums.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/EnglishEnums.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import java.util.Locale;
 
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/EnvironmentPropertySource.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/EnvironmentPropertySource.java
similarity index 95%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/EnvironmentPropertySource.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/EnvironmentPropertySource.java
index 65ca8b694f..15ad491709 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/EnvironmentPropertySource.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/EnvironmentPropertySource.java
@@ -14,7 +14,10 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
+
+import org.apache.logging.log4j.util.BiConsumer;
+import org.apache.logging.log4j.util.PropertySource;
 
 import java.util.Collection;
 import java.util.Map;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/LoaderUtil.java
similarity index 98%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/LoaderUtil.java
index 3c5e646c10..bfaace4f88 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/LoaderUtil.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
@@ -356,7 +356,7 @@ public final class LoaderUtil {
         return findResources(resource, true);
     }
 
-    static Collection<URL> findResources(final String resource, final boolean useTccl) {
+    public static Collection<URL> findResources(final String resource, final boolean useTccl) {
         final Collection<UrlResource> urlResources = findUrlResources(resource, useTccl);
         final Collection<URL> resources = new LinkedHashSet<>(urlResources.size());
         for (final UrlResource urlResource : urlResources) {
@@ -372,7 +372,7 @@ public final class LoaderUtil {
      * @param resource The resource to locate.
      * @return The located resources.
      */
-    static Collection<UrlResource> findUrlResources(final String resource, boolean useTccl) {
+    public static Collection<UrlResource> findUrlResources(final String resource, boolean useTccl) {
         // @formatter:off
         final ClassLoader[] candidates = {
                 getThreadContextClassLoader(),
@@ -398,11 +398,11 @@ public final class LoaderUtil {
     /**
      * {@link URL} and {@link ClassLoader} pair.
      */
-    static class UrlResource {
+    public static class UrlResource {
         private final ClassLoader classLoader;
         private final URL url;
 
-        UrlResource(final ClassLoader classLoader, final URL url) {
+        public UrlResource(final ClassLoader classLoader, final URL url) {
             this.classLoader = classLoader;
             this.url = url;
         }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/LowLevelLogUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/LowLevelLogUtil.java
similarity index 97%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/LowLevelLogUtil.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/LowLevelLogUtil.java
index 5cf40cabee..7bb3f83d02 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/LowLevelLogUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/LowLevelLogUtil.java
@@ -15,7 +15,7 @@
  * limitations under the license.
  */
 
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import java.io.OutputStream;
 import java.io.PrintWriter;
@@ -29,7 +29,7 @@ import java.util.Objects;
  *
  * @since 2.6
  */
-final class LowLevelLogUtil {
+public final class LowLevelLogUtil {
 
     private static PrintWriter writer = new PrintWriter(System.err, true);
 
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/NameUtil.java
similarity index 97%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/NameUtil.java
index 75cd2d4925..6daaa3124d 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/NameUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/NameUtil.java
@@ -14,7 +14,9 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
+
+import org.apache.logging.log4j.util.Strings;
 
 import java.nio.charset.Charset;
 import java.security.MessageDigest;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/PerformanceSensitive.java
similarity index 97%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/PerformanceSensitive.java
index 837347cf6f..07298fe852 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/PerformanceSensitive.java
@@ -15,7 +15,7 @@
  * limitations under the license.
  */
 
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PrivateSecurityManagerStackTraceUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/PrivateSecurityManagerStackTraceUtil.java
similarity index 98%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/PrivateSecurityManagerStackTraceUtil.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/PrivateSecurityManagerStackTraceUtil.java
index 2f2be07986..626b62fb76 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PrivateSecurityManagerStackTraceUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/PrivateSecurityManagerStackTraceUtil.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import java.util.ArrayDeque;
 import java.util.Deque;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/PropertiesUtil.java
similarity index 90%
copy from log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
copy to log4j-api/src/main/java/org/apache/logging/log4j/util3/PropertiesUtil.java
index 354edfbffe..4000416263 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/PropertiesUtil.java
@@ -14,14 +14,17 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
+
+import org.apache.logging.log4j.util.Lazy;
+import org.apache.logging.log4j.util.PropertiesPropertySource;
+import org.apache.logging.log4j.util.PropertyEnvironment;
+import org.apache.logging.log4j.util.PropertyFilePropertySource;
+import org.apache.logging.log4j.util.PropertySource;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.invoke.MethodHandles;
-import java.time.Duration;
-import java.time.temporal.ChronoUnit;
-import java.time.temporal.TemporalUnit;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -47,7 +50,7 @@ import java.util.concurrent.ConcurrentSkipListSet;
  *
  * @see PropertySource
  */
-public final class PropertiesUtil implements PropertyEnvironment {
+public class PropertiesUtil implements PropertyEnvironment {
 
     private static final String LOG4J_PROPERTIES_FILE_NAME = "log4j2.component.properties";
     private static final String LOG4J_SYSTEM_PROPERTIES_FILE_NAME = "log4j2.system.properties";
@@ -125,6 +128,10 @@ public final class PropertiesUtil implements PropertyEnvironment {
         return new Environment(new PropertyFilePropertySource(String.format("log4j2.%s.properties", namespace)));
     }
 
+    public static ResourceBundle getCharsetsResourceBundle() {
+        return ResourceBundle.getBundle("Log4j-charsets");
+    }
+
     @Override
     public void addPropertySource(PropertySource propertySource) {
         if (environment != null) {
@@ -348,10 +355,6 @@ public final class PropertiesUtil implements PropertyEnvironment {
         return subset;
     }
 
-    static ResourceBundle getCharsetsResourceBundle() {
-        return ResourceBundle.getBundle("Log4j-charsets");
-    }
-
     /**
      * Partitions a properties map based on common key prefixes up to the first period.
      *
@@ -396,40 +399,5 @@ public final class PropertiesUtil implements PropertyEnvironment {
         return parts;
     }
 
-    enum TimeUnit {
-        NANOS("ns,nano,nanos,nanosecond,nanoseconds", ChronoUnit.NANOS),
-        MICROS("us,micro,micros,microsecond,microseconds", ChronoUnit.MICROS),
-        MILLIS("ms,milli,millis,millsecond,milliseconds", ChronoUnit.MILLIS),
-        SECONDS("s,second,seconds", ChronoUnit.SECONDS),
-        MINUTES("m,minute,minutes", ChronoUnit.MINUTES),
-        HOURS("h,hour,hours", ChronoUnit.HOURS),
-        DAYS("d,day,days", ChronoUnit.DAYS);
-
-        private final String[] descriptions;
-        private final ChronoUnit timeUnit;
-
-        TimeUnit(final String descriptions, final ChronoUnit timeUnit) {
-            this.descriptions = descriptions.split(",");
-            this.timeUnit = timeUnit;
-        }
 
-        ChronoUnit getTimeUnit() {
-            return this.timeUnit;
-        }
-
-        static Duration getDuration(final String time) {
-            final String value = time.trim();
-            TemporalUnit temporalUnit = ChronoUnit.MILLIS;
-            long timeVal = 0;
-            for (final TimeUnit timeUnit : values()) {
-                for (final String suffix : timeUnit.descriptions) {
-                    if (value.endsWith(suffix)) {
-                        temporalUnit = timeUnit.timeUnit;
-                        timeVal = Long.parseLong(value.substring(0, value.length() - suffix.length()));
-                    }
-                }
-            }
-            return Duration.of(timeVal, temporalUnit);
-        }
-    }
 }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/ProviderUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/ProviderUtil.java
similarity index 99%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/ProviderUtil.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/ProviderUtil.java
index 3c103c7c57..9d560406b0 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/ProviderUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/ProviderUtil.java
@@ -14,7 +14,11 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
+
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.spi.Provider;
+import org.apache.logging.log4j.status.StatusLogger;
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
@@ -25,10 +29,6 @@ import java.util.Properties;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.spi.Provider;
-import org.apache.logging.log4j.status.StatusLogger;
-
 /**
  * <em>Consider this class private.</em> Utility class for Log4j {@link Provider}s. When integrating with an application
  * container framework, any Log4j Providers not accessible through standard classpath scanning should
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/ServiceLoaderUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/ServiceLoaderUtil.java
similarity index 99%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/ServiceLoaderUtil.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/ServiceLoaderUtil.java
index 16d46645c6..44542b0fd9 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/ServiceLoaderUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/ServiceLoaderUtil.java
@@ -14,7 +14,7 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import java.lang.invoke.CallSite;
 import java.lang.invoke.LambdaMetafactory;
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/ServiceRegistry.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/ServiceRegistry.java
similarity index 96%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/ServiceRegistry.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/ServiceRegistry.java
index f52859a5db..cb50982514 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/ServiceRegistry.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/ServiceRegistry.java
@@ -15,7 +15,9 @@
  * limitations under the license.
  */
 
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
+
+import org.apache.logging.log4j.util.Lazy;
 
 import java.lang.invoke.MethodHandles.Lookup;
 import java.util.ArrayList;
@@ -27,8 +29,6 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import static org.apache.logging.log4j.util.LazyUtil.cast;
-
 /**
  * Registry for service instances loaded from {@link ServiceLoader}. This abstracts the differences between using a flat
  * classpath, a module path, and OSGi modules.
@@ -37,6 +37,11 @@ import static org.apache.logging.log4j.util.LazyUtil.cast;
  */
 public class ServiceRegistry {
     private static final Lazy<ServiceRegistry> INSTANCE = Lazy.relaxed(ServiceRegistry::new);
+    @SuppressWarnings("unchecked")
+    private static <T> T cast(final Object o) {
+        return (T) o;
+    }
+
 
     /**
      * Returns the singleton ServiceRegistry instance.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/StackLocator.java
similarity index 98%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/StackLocator.java
index 020388658a..c7563aa1e4 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/StackLocator.java
@@ -14,13 +14,11 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import java.util.ArrayDeque;
 import java.util.Deque;
-import java.util.List;
 import java.util.function.Predicate;
-import java.util.stream.Collectors;
 
 /**
  * <em>Consider this class private.</em> Determines the caller's class.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocatorUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/StackLocatorUtil.java
similarity index 98%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocatorUtil.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/StackLocatorUtil.java
index 6f9ce9d9a8..d74d0bcdf1 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocatorUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/StackLocatorUtil.java
@@ -14,13 +14,14 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
 
 import java.util.Deque;
 import java.util.NoSuchElementException;
 import java.util.function.Predicate;
 
 import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Strings;
 
 /**
  * <em>Consider this class private.</em> Provides various methods to determine the caller class. <h3>Background</h3>
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/StringBuilders.java
similarity index 99%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/StringBuilders.java
index 9a1a9e939c..3e5a2489ff 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/StringBuilders.java
@@ -14,7 +14,9 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
+
+import org.apache.logging.log4j.util.StringBuilderFormattable;
 
 import java.util.Map.Entry;
 
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/SystemPropertiesPropertySource.java b/log4j-api/src/main/java/org/apache/logging/log4j/util3/SystemPropertiesPropertySource.java
similarity index 93%
rename from log4j-api/src/main/java/org/apache/logging/log4j/util/SystemPropertiesPropertySource.java
rename to log4j-api/src/main/java/org/apache/logging/log4j/util3/SystemPropertiesPropertySource.java
index 5f84836006..c3e6b9ee65 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/SystemPropertiesPropertySource.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util3/SystemPropertiesPropertySource.java
@@ -14,7 +14,11 @@
  * See the license for the specific language governing permissions and
  * limitations under the license.
  */
-package org.apache.logging.log4j.util;
+package org.apache.logging.log4j.util3;
+
+import org.apache.logging.log4j.util.BiConsumer;
+import org.apache.logging.log4j.util.PropertiesPropertySource;
+import org.apache.logging.log4j.util.PropertySource;
 
 import java.util.Collection;
 import java.util.Objects;
diff --git a/log4j-api/src/main/resources/META-INF/services/org.apache.logging.log4j.util.PropertySource b/log4j-api/src/main/resources/META-INF/services/org.apache.logging.log4j.util.PropertySource
index 39c959ca65..1c253fae51 100644
--- a/log4j-api/src/main/resources/META-INF/services/org.apache.logging.log4j.util.PropertySource
+++ b/log4j-api/src/main/resources/META-INF/services/org.apache.logging.log4j.util.PropertySource
@@ -12,5 +12,5 @@
 # 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.
-org.apache.logging.log4j.util.EnvironmentPropertySource
-org.apache.logging.log4j.util.SystemPropertiesPropertySource
\ No newline at end of file
+org.apache.logging.log4j.util3.EnvironmentPropertySource
+org.apache.logging.log4j.util3.SystemPropertiesPropertySource
diff --git a/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraExtension.java b/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraExtension.java
index 38503c428a..4f7b61861a 100644
--- a/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraExtension.java
+++ b/log4j-cassandra/src/test/java/org/apache/logging/log4j/cassandra/CassandraExtension.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.core.util.Cancellable;
 import org.apache.logging.log4j.core.util.Closer;
 import org.apache.logging.log4j.core.util.Log4jThreadFactory;
 import org.apache.logging.log4j.core.util.Throwables;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.junit.jupiter.api.extension.AfterEachCallback;
 import org.junit.jupiter.api.extension.BeforeEachCallback;
 import org.junit.jupiter.api.extension.ExtensionContext;
diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/util/Profiler.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/util/Profiler.java
index e63e6a57a3..149636ebed 100644
--- a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/util/Profiler.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/util/Profiler.java
@@ -18,8 +18,8 @@ package org.apache.logging.log4j.core.test.util;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 /**
  * YourKit Java Profiler helper class.
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/TestPatternConverters.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/TestPatternConverters.java
index 23cb4a0c9c..d6a46c7f96 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/TestPatternConverters.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/TestPatternConverters.java
@@ -20,7 +20,7 @@ import org.apache.logging.log4j.core.pattern.ConverterKeys;
 import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 /**
  * {@link TestPatternConverters} provides {@link LogEventPatternConverter} implementations that may be
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
index ad0a0dd3e6..3e2c4e4728 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/SyslogAppenderTest.java
@@ -22,7 +22,7 @@ import java.net.SocketException;
 import org.apache.logging.log4j.core.appender.SyslogAppender.Builder;
 import org.apache.logging.log4j.core.net.Protocol;
 import org.apache.logging.log4j.core.test.net.mock.MockSyslogServerFactory;
-import org.apache.logging.log4j.util.EnglishEnums;
+import org.apache.logging.log4j.util3.EnglishEnums;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
index 6f3afbc7c7..5db033c3d6 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogAppenderTest.java
@@ -32,7 +32,7 @@ import org.apache.logging.log4j.core.test.net.ssl.TestConstants;
 import org.apache.logging.log4j.core.test.net.ssl.TlsSyslogMessageFormat;
 import org.apache.logging.log4j.core.net.ssl.TlsSyslogTestUtil;
 import org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration;
-import org.apache.logging.log4j.util.EnglishEnums;
+import org.apache.logging.log4j.util3.EnglishEnums;
 import org.junit.Test;
 
 public class TlsSyslogAppenderTest extends SyslogAppenderTest {
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogFrameTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogFrameTest.java
index 03d23c170c..3ed35a2150 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogFrameTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/TlsSyslogFrameTest.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.appender;
 
 import java.nio.charset.StandardCharsets;
 
-import org.apache.logging.log4j.util.Chars;
+import org.apache.logging.log4j.util3.Chars;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
index 9589a01a9f..4a997a8097 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.async;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.test.categories.AsyncLoggers;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java
index 45201b94ce..9700f10c76 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java
@@ -31,8 +31,8 @@ import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.spi.DefaultThreadContextMap;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
 import org.apache.logging.log4j.test.junit.CleanUpFiles;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.Unbox;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Tag;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncWaitStrategyFactoryConfigGlobalLoggersTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncWaitStrategyFactoryConfigGlobalLoggersTest.java
index de4217ac51..fd805fce34 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncWaitStrategyFactoryConfigGlobalLoggersTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncWaitStrategyFactoryConfigGlobalLoggersTest.java
@@ -18,18 +18,18 @@ package org.apache.logging.log4j.core.async;
 
 import com.lmax.disruptor.YieldingWaitStrategy;
 import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.core.test.categories.AsyncLoggers;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.test.categories.AsyncLoggers;
 import org.apache.logging.log4j.core.util.Constants;
-import org.apache.logging.log4j.util.Strings;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 @Category(AsyncLoggers.class)
 public class AsyncWaitStrategyFactoryConfigGlobalLoggersTest {
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/perftest/ResponseTimeTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/perftest/ResponseTimeTest.java
index 2898f95ff6..b4a96bb852 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/perftest/ResponseTimeTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/perftest/ResponseTimeTest.java
@@ -32,7 +32,7 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
-import static org.apache.logging.log4j.util.Constants.isThreadLocalsEnabled;
+import static org.apache.logging.log4j.util3.Constants.isThreadLocalsEnabled;
 
 /**
  * Latency test showing both service time and response time.
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java
index bebafb261d..e5c72894ef 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java
@@ -20,7 +20,7 @@ import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.ContextDataInjector;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
 import org.apache.logging.log4j.test.ThreadContextUtilityClass;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringMap;
 import org.junit.After;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
index 28941a49b8..33898b3645 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/layout/GelfLayoutTest.java
@@ -33,8 +33,8 @@ import org.apache.logging.log4j.core.test.appender.ListAppender;
 import org.apache.logging.log4j.core.util.KeyValuePair;
 import org.apache.logging.log4j.core.util.NetUtils;
 import org.apache.logging.log4j.test.junit.UsingAnyThreadContext;
-import org.apache.logging.log4j.util.Chars;
 import org.apache.logging.log4j.util.Lazy;
+import org.apache.logging.log4j.util3.Chars;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactoryTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactoryTest.java
index e6de0db6a2..89368eee91 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactoryTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactoryTest.java
@@ -22,7 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 import java.util.Properties;
 
 import org.apache.logging.log4j.core.test.net.ssl.TestConstants;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.junit.jupiter.api.Test;
 
 public class SslConfigurationFactoryTest {
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java
index b424a16764..12fdc2cf16 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/pattern/DatePatternConverterTest.java
@@ -22,8 +22,8 @@ import org.apache.logging.log4j.core.time.Instant;
 import org.apache.logging.log4j.core.time.MutableInstant;
 import org.apache.logging.log4j.core.time.internal.format.FixedDateFormat;
 import org.apache.logging.log4j.core.time.internal.format.FixedDateFormat.FixedTimeZoneFormat;
-import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.Constants;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/selector/TestClassLoader.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/selector/TestClassLoader.java
index 49e63c2040..89fe24826d 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/selector/TestClassLoader.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/selector/TestClassLoader.java
@@ -25,7 +25,7 @@ import java.net.URLConnection;
 import org.apache.commons.io.IOUtils;
 import org.apache.logging.log4j.core.util.Closer;
 import org.apache.logging.log4j.core.util.Throwables;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 /**
  * ClassLoader that loads class in this package (or sub-package) by hand, otherwise delegating to the TCCL.
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchHttpTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchHttpTest.java
index cd73ef6d60..cc0a392a3b 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchHttpTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/util/WatchHttpTest.java
@@ -37,7 +37,7 @@ import org.apache.logging.log4j.core.net.UrlConnectionFactory;
 import org.apache.logging.log4j.core.test.net.ssl.TestConstants;
 import org.apache.logging.log4j.core.time.internal.format.FastDateFormat;
 import org.apache.logging.log4j.test.junit.StatusLoggerRule;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.junit.Assume;
 import org.junit.BeforeClass;
 import org.junit.ClassRule;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
index bd059be78c..2e6d219599 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/Filter.java
@@ -20,8 +20,8 @@ package org.apache.logging.log4j.core;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.message.Message;
-import org.apache.logging.log4j.util.Constants;
-import org.apache.logging.log4j.util.EnglishEnums;
+import org.apache.logging.log4j.util3.Constants;
+import org.apache.logging.log4j.util3.EnglishEnums;
 
 /**
  * Interface that must be implemented to allow custom event filtering. It is highly recommended that
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
index ddc22eefc9..ef93e4d08c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
@@ -25,7 +25,6 @@ import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import org.apache.logging.log4j.core.config.NullConfiguration;
 import org.apache.logging.log4j.core.config.Reconfigurable;
 import org.apache.logging.log4j.core.jmx.Server;
-import org.apache.logging.log4j.core.selector.ContextSelector;
 import org.apache.logging.log4j.core.util.Cancellable;
 import org.apache.logging.log4j.core.util.ExecutorServices;
 import org.apache.logging.log4j.core.util.NetUtils;
@@ -41,7 +40,7 @@ import org.apache.logging.log4j.spi.LoggerContextShutdownEnabled;
 import org.apache.logging.log4j.spi.LoggerRegistry;
 import org.apache.logging.log4j.spi.Terminable;
 import org.apache.logging.log4j.spi.ThreadContextMapFactory;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
index 08a07418fc..39b5188f45 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
@@ -28,9 +28,9 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
 import org.apache.logging.log4j.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.util.Chars;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
+import org.apache.logging.log4j.util3.Chars;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.io.FileDescriptor;
 import java.io.FileOutputStream;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/TlsSyslogFrame.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/TlsSyslogFrame.java
index 27e90cdfd4..1420aed501 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/TlsSyslogFrame.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/TlsSyslogFrame.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.appender;
 
 import java.nio.charset.StandardCharsets;
 
-import org.apache.logging.log4j.util.Chars;
+import org.apache.logging.log4j.util3.Chars;
 
 /**
  * Wraps messages that are formatted according to RFC 5425.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
index 1ab886fc71..3568995dd8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
@@ -37,8 +37,8 @@ import org.apache.logging.log4j.message.MessageFactory;
 import org.apache.logging.log4j.message.ReusableMessage;
 import org.apache.logging.log4j.spi.AbstractLogger;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.StackLocatorUtil;
 import org.apache.logging.log4j.util.StringMap;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 import java.util.List;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelector.java
index ce3e7e4c51..6e9fe462de 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerContextSelector.java
@@ -22,7 +22,7 @@ import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.plugins.Inject;
 import org.apache.logging.log4j.plugins.Singleton;
 import org.apache.logging.log4j.plugins.di.Injector;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.net.URI;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java
index b73f4034b4..46054afe63 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java
@@ -20,8 +20,8 @@ import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Creates {@link AsyncQueueFullPolicy} instances based on user-specified system properties. The {@code AsyncQueueFullPolicy}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DefaultAsyncWaitStrategyFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DefaultAsyncWaitStrategyFactory.java
index a5c54ae4ed..06293254d3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DefaultAsyncWaitStrategyFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DefaultAsyncWaitStrategyFactory.java
@@ -23,8 +23,8 @@ import com.lmax.disruptor.WaitStrategy;
 import com.lmax.disruptor.YieldingWaitStrategy;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.util.concurrent.TimeUnit;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
index 45e529efa1..c43dcab32f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
@@ -23,12 +23,12 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 
-import static org.apache.logging.log4j.util.Constants.isThreadLocalsEnabled;
+import static org.apache.logging.log4j.util3.Constants.isThreadLocalsEnabled;
 
 /**
  * Utility methods for getting Disruptor related configuration.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
index 93c389c9ef..9adeeadd86 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/RingBufferLogEvent.java
@@ -37,14 +37,14 @@ import org.apache.logging.log4j.message.ReusableMessage;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.message.TimestampMessage;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.StringBuilders;
 import org.apache.logging.log4j.util.StringMap;
 import org.apache.logging.log4j.util.Strings;
 
 import java.io.IOException;
 import java.util.Arrays;
 
-import static org.apache.logging.log4j.util.Constants.isThreadLocalsEnabled;
+import static org.apache.logging.log4j.util3.Constants.isThreadLocalsEnabled;
 
 /**
  * When the Disruptor is started, the RingBuffer is populated with event objects. These objects are then re-used during
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
index c686fbc6b5..3e3fc507e6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/ThreadNameCachingStrategy.java
@@ -21,8 +21,8 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.Constants;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.Constants;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Strategy for deciding whether thread name should be cached or not.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
index 64a4511167..4f77448f76 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
@@ -61,9 +61,9 @@ import org.apache.logging.log4j.plugins.model.PluginNamespace;
 import org.apache.logging.log4j.plugins.model.PluginType;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.util.Lazy;
-import org.apache.logging.log4j.util.NameUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
-import org.apache.logging.log4j.util.ServiceRegistry;
+import org.apache.logging.log4j.util3.NameUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+import org.apache.logging.log4j.util3.ServiceRegistry;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
index b99145494a..0723a6be80 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
@@ -16,8 +16,6 @@
  */
 package org.apache.logging.log4j.core.config;
 
-import java.util.Objects;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Filter;
@@ -25,7 +23,9 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AppenderLoggingException;
 import org.apache.logging.log4j.core.filter.AbstractFilterable;
 import org.apache.logging.log4j.core.filter.Filterable;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+
+import java.util.Objects;
 
 /**
  * Wraps an {@link Appender} with details an appender implementation shouldn't need to know about.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
index 54e89ab38d..c8bbf3b630 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
@@ -16,15 +16,15 @@
  */
 package org.apache.logging.log4j.core.config;
 
+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 
-import org.apache.logging.log4j.core.Appender;
-import org.apache.logging.log4j.util.PerformanceSensitive;
-
 /**
  * Data structure with similar semantics to CopyOnWriteArraySet, but giving direct access to the underlying array.
  *
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AwaitUnconditionallyReliabilityStrategy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AwaitUnconditionallyReliabilityStrategy.java
index 5902a3f8a5..28c10ffd25 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AwaitUnconditionallyReliabilityStrategy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AwaitUnconditionallyReliabilityStrategy.java
@@ -17,15 +17,15 @@
 
 package org.apache.logging.log4j.core.config;
 
-import java.util.Objects;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.Supplier;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+
+import java.util.Objects;
 
 /**
  * Reliability strategy that sleeps unconditionally for some time before allowing a Configuration to be stopped.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
index d513da1076..ece975585b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
@@ -28,8 +28,8 @@ import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.plugins.model.PluginNamespace;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 import java.net.URI;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java
index 66680f197c..e5b80d17f9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationSource.java
@@ -24,8 +24,8 @@ import org.apache.logging.log4j.core.util.AuthorizationProvider;
 import org.apache.logging.log4j.core.util.FileUtils;
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.core.util.Source;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import javax.net.ssl.HttpsURLConnection;
 import java.io.ByteArrayInputStream;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
index 966d339180..e6b0ca4b15 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/Configurator.java
@@ -24,8 +24,8 @@ import org.apache.logging.log4j.core.impl.Log4jContextFactory;
 import org.apache.logging.log4j.core.util.NetUtils;
 import org.apache.logging.log4j.spi.LoggerContextFactory;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.StackLocatorUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 import java.net.URI;
 import java.util.List;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultConfigurationFactory.java
index 774509482a..39f91a3366 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultConfigurationFactory.java
@@ -25,10 +25,10 @@ import org.apache.logging.log4j.core.util.NetUtils;
 import org.apache.logging.log4j.plugins.Inject;
 import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.util.Lazy;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.LoaderUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.net.URI;
 import java.net.URISyntaxException;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/HttpWatcher.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/HttpWatcher.java
index e5301ed0a0..2260d1a959 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/HttpWatcher.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/HttpWatcher.java
@@ -29,7 +29,7 @@ import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAliases;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.io.IOException;
 import java.net.MalformedURLException;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
index 7e096f77af..a074670171 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
@@ -44,9 +44,9 @@ import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
 import org.apache.logging.log4j.plugins.validation.constraints.Required;
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.StackLocatorUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java
index 542cd759fb..bbe2d42b9c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ReliabilityStrategyFactory.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.config;
 
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Factory for ReliabilityStrategies.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/arbiters/ClassArbiter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/arbiters/ClassArbiter.java
index 8033b6eb43..620db400dd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/arbiters/ClassArbiter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/arbiters/ClassArbiter.java
@@ -20,7 +20,7 @@ import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
 import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 /**
  * Conditional that determines if the specified class is present.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
index 34cf35d007..908aba62a1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/convert/CoreTypeConverters.java
@@ -23,7 +23,7 @@ import org.apache.logging.log4j.core.util.CronExpression;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.convert.TypeConverter;
 import org.apache.logging.log4j.plugins.convert.TypeConverters;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 import java.io.File;
 import java.math.BigDecimal;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginAttributeVisitor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginAttributeVisitor.java
index 295bb53efe..8562f431cd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginAttributeVisitor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginAttributeVisitor.java
@@ -25,8 +25,8 @@ import org.apache.logging.log4j.plugins.convert.TypeConverter;
 import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.plugins.di.Keys;
 import org.apache.logging.log4j.plugins.visit.NodeVisitor;
-import org.apache.logging.log4j.util.StringBuilders;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Parameter;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginConfigurationVisitor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginConfigurationVisitor.java
index e20bff752b..fb04dbba65 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginConfigurationVisitor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginConfigurationVisitor.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.plugins.visit.NodeVisitor;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Parameter;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginLoggerContextVisitor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginLoggerContextVisitor.java
index 0b699f6833..52a1d9e591 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginLoggerContextVisitor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visit/PluginLoggerContextVisitor.java
@@ -17,10 +17,6 @@
 
 package org.apache.logging.log4j.core.config.plugins.visit;
 
-import java.lang.ref.WeakReference;
-import java.lang.reflect.Field;
-import java.lang.reflect.Parameter;
-
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
@@ -29,7 +25,11 @@ import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.plugins.visit.NodeVisitor;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.StringBuilders;
+
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Field;
+import java.lang.reflect.Parameter;
 
 /**
  * PluginVisitor implementation for {@link PluginConfiguration}.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
index bf29925135..7866667323 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/properties/PropertiesConfigurationBuilder.java
@@ -40,8 +40,8 @@ import org.apache.logging.log4j.core.config.builder.api.ScriptFileComponentBuild
 import org.apache.logging.log4j.core.filter.AbstractFilter.AbstractFilterBuilder;
 import org.apache.logging.log4j.plugins.util.Builder;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.util.Map;
 import java.util.Objects;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
index 7b49827ba3..c8128f8faa 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/CompositeFilter.java
@@ -29,7 +29,7 @@ import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DenyAllFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DenyAllFilter.java
index 567ad95886..78dfa9c98a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DenyAllFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DenyAllFilter.java
@@ -25,7 +25,7 @@ import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * This filter causes all logging events to be dropped.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java
index 772331aa25..36bd8897e6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/DynamicThresholdFilter.java
@@ -33,9 +33,9 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.StringMap;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.Map;
 import java.util.Objects;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelMatchFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelMatchFilter.java
index 50b07f5112..a7c673f68c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelMatchFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelMatchFilter.java
@@ -26,7 +26,7 @@ import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * This filter returns the onMatch result if the logging level in the event matches the specified logging level
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
index c0eb6400d4..2c0aa82972 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/LevelRangeFilter.java
@@ -26,7 +26,7 @@ import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * This filter returns the {@code onMatch} result if the level in the {@code LogEvent} is in the range of the configured
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
index 115efa5711..a1b13c92cb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MapFilter.java
@@ -31,9 +31,9 @@ import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
 import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
 import org.apache.logging.log4j.util.IndexedStringMap;
-import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
index bdcc982ba7..b248708476 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MarkerFilter.java
@@ -26,7 +26,7 @@ import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * This filter returns the onMatch result if the marker in the LogEvent is the same as or has the
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java
index e2266f84d9..dfe00b8e7c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/MutableThreadContextMapFilter.java
@@ -41,8 +41,8 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAliases;
 import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.io.File;
 import java.io.FileInputStream;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/NoMarkerFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/NoMarkerFilter.java
index 01b970ba23..a981310be3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/NoMarkerFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/NoMarkerFilter.java
@@ -25,7 +25,7 @@ import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * This filter returns the onMatch result if there is no marker in the LogEvent.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StringMatchFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StringMatchFilter.java
index 3542269683..12435c4dfd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StringMatchFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StringMatchFilter.java
@@ -26,7 +26,7 @@ import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * This filter returns the onMatch result if the logging level in the event matches the specified logging level
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StructuredDataFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StructuredDataFilter.java
index 4f18b0d001..e3deed7a13 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StructuredDataFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/StructuredDataFilter.java
@@ -30,8 +30,8 @@ import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
 import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java
index 28a74abee2..4d0cb37c17 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThreadContextMapFilter.java
@@ -35,7 +35,7 @@ import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
 import org.apache.logging.log4j.plugins.validation.constraints.Required;
 import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.StringMap;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
index 1a55c8e4b4..99cde63007 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/ThresholdFilter.java
@@ -26,7 +26,7 @@ import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * This filter returns the onMatch result if the level in the LogEvent is the same or more specific
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
index ebc9f06c79..e2ecda7ddb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/TimeFilter.java
@@ -29,7 +29,7 @@ import org.apache.logging.log4j.plugins.Inject;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.time.Duration;
 import java.time.Instant;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java
index cb745fff62..01f31ed7e5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataFactory.java
@@ -16,18 +16,18 @@
  */
 package org.apache.logging.log4j.core.impl;
 
-import java.lang.reflect.Constructor;
-import java.util.Map;
-import java.util.Map.Entry;
-
 import org.apache.logging.log4j.core.ContextDataInjector;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.util.IndexedStringMap;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringMap;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+
+import java.lang.reflect.Constructor;
+import java.util.Map;
+import java.util.Map.Entry;
 
 /**
  * Factory for creating the StringMap instances used to initialize LogEvents' {@linkplain LogEvent#getContextData()
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java
index 74925f6cb9..b4539c665e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ContextDataInjectorFactory.java
@@ -24,8 +24,8 @@ import org.apache.logging.log4j.spi.CopyOnWrite;
 import org.apache.logging.log4j.spi.DefaultThreadContextMap;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Factory for ContextDataInjectors. Returns a new {@code ContextDataInjector} instance based on the value of system
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultBundle.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultBundle.java
index 3b03b75db1..c0406a96d7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultBundle.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultBundle.java
@@ -56,13 +56,13 @@ import org.apache.logging.log4j.spi.CopyOnWrite;
 import org.apache.logging.log4j.spi.DefaultThreadContextMap;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.util.Map;
 import java.util.function.Supplier;
 
-import static org.apache.logging.log4j.util.Constants.isThreadLocalsEnabled;
+import static org.apache.logging.log4j.util3.Constants.isThreadLocalsEnabled;
 
 /**
  * Contains default bindings for Log4j including support for {@link PropertiesUtil}-based configuration.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultCallback.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultCallback.java
index 410e74b24a..0c75115866 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultCallback.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultCallback.java
@@ -20,7 +20,7 @@ package org.apache.logging.log4j.core.impl;
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.plugins.di.InjectorCallback;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 public class DefaultCallback implements InjectorCallback {
     @Override
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
index 573cb12225..e2ba84d279 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
@@ -34,7 +34,7 @@ import org.apache.logging.log4j.plugins.di.DI;
 import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.spi.LoggerContextFactory;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.net.URI;
 import java.util.ArrayList;
@@ -42,7 +42,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
-import static org.apache.logging.log4j.util.Constants.isWebApp;
+import static org.apache.logging.log4j.util3.Constants.isWebApp;
 
 /**
  * Factory to locate a ContextSelector and then load a LoggerContext.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
index bb64e9f6d8..e116d24678 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jLogEvent.java
@@ -33,9 +33,9 @@ import org.apache.logging.log4j.message.ReusableMessage;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.message.TimestampMessage;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
-import org.apache.logging.log4j.util.StackLocatorUtil;
 import org.apache.logging.log4j.util.StringMap;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 import java.io.IOException;
 import java.io.InvalidObjectException;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
index 7863cd2657..0fbe131ff0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/MutableLogEvent.java
@@ -16,26 +16,31 @@
  */
 package org.apache.logging.log4j.core.impl;
 
-import java.io.InvalidObjectException;
-import java.io.ObjectInputStream;
-import java.util.Arrays;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.async.InternalAsyncUtil;
 import org.apache.logging.log4j.core.time.Clock;
-import org.apache.logging.log4j.core.time.NanoClock;
-import org.apache.logging.log4j.core.util.*;
 import org.apache.logging.log4j.core.time.Instant;
 import org.apache.logging.log4j.core.time.MutableInstant;
-import org.apache.logging.log4j.message.*;
+import org.apache.logging.log4j.core.time.NanoClock;
+import org.apache.logging.log4j.core.util.Constants;
+import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.message.ParameterConsumer;
+import org.apache.logging.log4j.message.ParameterVisitable;
+import org.apache.logging.log4j.message.ReusableMessage;
+import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.message.TimestampMessage;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
-import org.apache.logging.log4j.util.StackLocatorUtil;
-import org.apache.logging.log4j.util.StringBuilders;
 import org.apache.logging.log4j.util.StringMap;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StringBuilders;
+
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
+import java.util.Arrays;
 
 /**
  * Mutable implementation of the {@code LogEvent} interface.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java
index 9fc5dbcee8..8080805235 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjector.java
@@ -31,7 +31,7 @@ import org.apache.logging.log4j.core.config.Property;
 import org.apache.logging.log4j.core.util.ContextDataProvider;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
-import org.apache.logging.log4j.util.ServiceRegistry;
+import org.apache.logging.log4j.util3.ServiceRegistry;
 import org.apache.logging.log4j.util.StringMap;
 
 /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java
index 1e4d3d889d..364accbc31 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxy.java
@@ -27,7 +27,7 @@ import java.util.Set;
 
 import org.apache.logging.log4j.core.pattern.PlainTextRenderer;
 import org.apache.logging.log4j.core.pattern.TextRenderer;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 import org.apache.logging.log4j.util.Strings;
 
 /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxyHelper.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxyHelper.java
index 66b701447f..732ac2c160 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxyHelper.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/ThrowableProxyHelper.java
@@ -27,7 +27,7 @@ import java.util.Set;
 
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 /**
  * {@link ThrowableProxyHelper} provides utilities required to initialize a new {@link ThrowableProxy}
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/Server.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/Server.java
index f3add96827..3875e42922 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/Server.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/jmx/Server.java
@@ -28,8 +28,8 @@ import org.apache.logging.log4j.core.selector.ContextSelector;
 import org.apache.logging.log4j.core.util.Log4jThreadFactory;
 import org.apache.logging.log4j.spi.LoggerContextFactory;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.Constants;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.Constants;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import javax.management.InstanceAlreadyExistsException;
 import javax.management.InstanceNotFoundException;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
index 7861cb5410..2237f7d9e8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/AbstractStringLayout.java
@@ -26,9 +26,9 @@ import org.apache.logging.log4j.core.util.StringEncoder;
 import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.spi.AbstractLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
-import org.apache.logging.log4j.util.StringBuilders;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index dfa94b0ce3..62ef1188fc 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -31,9 +31,9 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.nio.charset.Charset;
 import java.util.Arrays;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
index bed7602c95..c3b13da906 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/Rfc5424Layout.java
@@ -46,7 +46,7 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.StringBuilders;
 import org.apache.logging.log4j.util.Strings;
 
 import java.nio.charset.Charset;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java
index f6cf978cc3..650ab156af 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/SyslogLayout.java
@@ -25,7 +25,7 @@ import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.Chars;
+import org.apache.logging.log4j.util3.Chars;
 
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrMatcher.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrMatcher.java
index bea426234b..2fb80bacf7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrMatcher.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/lookup/StrMatcher.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.lookup;
 
 import java.util.Arrays;
 
-import org.apache.logging.log4j.util.Chars;
+import org.apache.logging.log4j.util3.Chars;
 import org.apache.logging.log4j.util.Strings;
 
 /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInformation.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInformation.java
index af7bf8b833..74dce2b9e2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInformation.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/message/ExtendedThreadInformation.java
@@ -16,13 +16,13 @@
  */
 package org.apache.logging.log4j.core.message;
 
+import org.apache.logging.log4j.message.ThreadInformation;
+import org.apache.logging.log4j.util3.StringBuilders;
+
 import java.lang.management.LockInfo;
 import java.lang.management.MonitorInfo;
 import java.lang.management.ThreadInfo;
 
-import org.apache.logging.log4j.message.ThreadInformation;
-import org.apache.logging.log4j.util.StringBuilders;
-
 /**
  * Provides information on locks and monitors in the thread dump. This class requires Java 1.6 to compile and
  * run.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/Facility.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/Facility.java
index a03dc334dd..6612e80e2a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/Facility.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/Facility.java
@@ -16,7 +16,7 @@
  */
 package org.apache.logging.log4j.core.net;
 
-import org.apache.logging.log4j.util.EnglishEnums;
+import org.apache.logging.log4j.util3.EnglishEnums;
 
 /**
  *  The facility codes used by the Syslog system.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/MulticastDnsAdvertiser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/MulticastDnsAdvertiser.java
index 3b145233d0..d3f72c9606 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/MulticastDnsAdvertiser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/MulticastDnsAdvertiser.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.plugins.Configurable;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java
index d60753a920..6b947d33d8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.core.net.ssl.LaxHostnameVerifier;
 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
 import org.apache.logging.log4j.core.net.ssl.SslConfigurationFactory;
 import org.apache.logging.log4j.core.util.AuthorizationProvider;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.Strings;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactory.java
index 6fdbbbc8a7..095389c1d3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactory.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.net.ssl;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Lazy;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
 
 /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/Activator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/Activator.java
index 2cebdb454b..9d2720b114 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/Activator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/Activator.java
@@ -26,8 +26,8 @@ import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.plugins.model.PluginRegistry;
 import org.apache.logging.log4j.plugins.model.PluginService;
 import org.apache.logging.log4j.spi.Provider;
-import org.apache.logging.log4j.util.PropertiesUtil;
-import org.apache.logging.log4j.util.ServiceRegistry;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+import org.apache.logging.log4j.util3.ServiceRegistry;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/BundleContextSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/BundleContextSelector.java
index 165f3106a4..5d836c9d47 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/BundleContextSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/osgi/BundleContextSelector.java
@@ -22,7 +22,7 @@ import org.apache.logging.log4j.core.selector.ClassLoaderContextSelector;
 import org.apache.logging.log4j.plugins.Inject;
 import org.apache.logging.log4j.plugins.Singleton;
 import org.apache.logging.log4j.plugins.di.Injector;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleReference;
 import org.osgi.framework.FrameworkUtil;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AbstractStyleNameConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AbstractStyleNameConverter.java
index d9911a6389..cf97c768a9 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AbstractStyleNameConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AbstractStyleNameConverter.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AnsiEscape.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AnsiEscape.java
index c83123453e..26dc0ecad4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AnsiEscape.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/AnsiEscape.java
@@ -16,14 +16,14 @@
  */
 package org.apache.logging.log4j.core.pattern;
 
+import org.apache.logging.log4j.core.util.Patterns;
+import org.apache.logging.log4j.util3.EnglishEnums;
+
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 
-import org.apache.logging.log4j.core.util.Patterns;
-import org.apache.logging.log4j.util.EnglishEnums;
-
 /**
  * Converts text into ANSI escape sequences.
  * <p>
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
index cb52abf37c..8687daa36c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/DatePatternConverter.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.core.time.internal.format.FixedDateFormat;
 import org.apache.logging.log4j.core.time.internal.format.FixedDateFormat.FixedFormat;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.Arrays;
 import java.util.Date;
@@ -33,7 +33,7 @@ import java.util.Objects;
 import java.util.TimeZone;
 import java.util.concurrent.atomic.AtomicReference;
 
-import static org.apache.logging.log4j.util.Constants.isThreadLocalsEnabled;
+import static org.apache.logging.log4j.util3.Constants.isThreadLocalsEnabled;
 
 /**
  * Converts and formats the event's date in a StringBuilder.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
index f140e5a911..020bd0f38f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
@@ -21,9 +21,9 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.EnglishEnums;
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.EnglishEnums;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.util.List;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java
index a77c1830bd..b13351b5f6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EndOfBatchPatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Formats the EndOfBatch.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
index df4571a7f9..c1e619c5ec 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsBaseReplacementConverter.java
@@ -16,10 +16,10 @@
  */
 package org.apache.logging.log4j.core.pattern;
 
-import java.util.List;
-
 import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+
+import java.util.List;
 
 /**
  * Equals pattern converter.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
index 404c5625e2..527a3e12e4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsIgnoreCaseReplacementConverter.java
@@ -20,8 +20,8 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.util.List;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
index 7603af9d43..68881d461a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EqualsReplacementConverter.java
@@ -20,8 +20,8 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.util.List;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java
index 0b9cbde9de..43638315c6 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FileDatePatternConverter.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.pattern;
 
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Formats a date by delegating to {@link DatePatternConverter}.  The default
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FormattingInfo.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FormattingInfo.java
index fa2019f369..8c7f382b5b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FormattingInfo.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/FormattingInfo.java
@@ -17,7 +17,7 @@
 
 package org.apache.logging.log4j.core.pattern;
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Modifies the output of a pattern converter for a specified minimum and maximum width and alignment.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
index e0c8dba64c..ac9a576a90 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java
@@ -22,8 +22,8 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.Arrays;
 import java.util.HashMap;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
index 48631d279c..0059e7832e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/IntegerPatternConverter.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.pattern;
 
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.Date;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
index 7b9dc8ba57..4e5db3ec85 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LevelPatternConverter.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.util.Patterns;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.HashMap;
 import java.util.Locale;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java
index 6ab333d898..1ab753f532 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LineSeparatorPatternConverter.java
@@ -19,8 +19,8 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Formats a line separator.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java
index ba0d9ec12d..90b8fa73bb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LiteralPatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.util.OptionConverter;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 
 /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java
index 769b367e83..25622074d2 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerFqcnPatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Formats the Logger FQCN.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java
index 9cfb5ebb46..1da1a96a29 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/LoggerPatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 
 /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
index efba002a88..fdf36d3260 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java
@@ -20,8 +20,8 @@ import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 /**
  * Returns events' full marker string in a StringBuilder.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java
index c11b8da004..90f1282dcb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerSimpleNamePatternConverter.java
@@ -20,7 +20,7 @@ import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Appends an event's maker name to a StringBuilder.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
index c97775c237..92adfd95c4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MaxLengthConverter.java
@@ -23,7 +23,7 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.List;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
index 9649886607..9a6b634c73 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
@@ -19,10 +19,10 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
-import org.apache.logging.log4j.util.StringBuilders;
 import org.apache.logging.log4j.util.TriConsumer;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 /**
  * Able to handle the contents of the LogEvent's MDC and either
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
index 87c5b62d12..e68e7eb356 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
@@ -25,9 +25,9 @@ import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.MultiFormatStringBuilderFormattable;
-import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java
index 4b768756e2..a4a62919fd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NameAbbreviator.java
@@ -16,11 +16,11 @@
  */
 package org.apache.logging.log4j.core.pattern;
 
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
-
 
 /**
  * NameAbbreviator generates abbreviated logger and class names.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NamePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NamePatternConverter.java
index d6ba52d093..fc84195675 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NamePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NamePatternConverter.java
@@ -17,7 +17,7 @@
 package org.apache.logging.log4j.core.pattern;
 
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Abstract base class for other pattern converters which can return only parts of their name.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java
index 50597dd003..6a7c8c885e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NanoTimePatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Converts and formats the event's nanoTime in a StringBuilder.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NdcPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NdcPatternConverter.java
index 31deeb1252..775e46186e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NdcPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/NdcPatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 
 /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
index 5c8cd68a3e..992f0ffb60 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RelativeTimePatternConverter.java
@@ -16,12 +16,12 @@
  */
 package org.apache.logging.log4j.core.pattern;
 
-import java.lang.management.ManagementFactory;
-
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
+
+import java.lang.management.ManagementFactory;
 
 /**
  * Returns the relative time in milliseconds since JVM Startup.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RepeatPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RepeatPatternConverter.java
index 59d6a8d8f2..972d4e5659 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RepeatPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/RepeatPatternConverter.java
@@ -20,8 +20,8 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Equals pattern converter.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
index 2db77bd5fa..55c9bad030 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SequenceNumberPatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.concurrent.atomic.AtomicLong;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SimpleLiteralPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SimpleLiteralPatternConverter.java
index d3abe55e0e..c25f473fef 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SimpleLiteralPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/SimpleLiteralPatternConverter.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.core.pattern;
 
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.util.OptionConverter;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 
 /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
index 1b11e7d42d..e3bf752750 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java
@@ -22,7 +22,7 @@ import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.util.Patterns;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.Arrays;
 import java.util.List;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
index ae4aca18f0..2e84d9763b 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadIdPatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Formats the event thread ID.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
index 1fe60dd78b..45efeb7a73 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadNamePatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Formats the event thread name.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
index 079cfeed63..aa56d6b7fa 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/ThreadPriorityPatternConverter.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.core.pattern;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 /**
  * Formats the event thread priority.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/VariablesNotEmptyReplacementConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/VariablesNotEmptyReplacementConverter.java
index 5016bb39c1..b094a5fac5 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/VariablesNotEmptyReplacementConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/VariablesNotEmptyReplacementConverter.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.util.List;
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java
index c912000892..672e5d3455 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/selector/ClassLoaderContextSelector.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.spi.LoggerContextShutdownAware;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Lazy;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 import java.lang.ref.WeakReference;
 import java.net.URI;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/MutableInstant.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/MutableInstant.java
index 483ed7a7fe..b06afaa76d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/MutableInstant.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/MutableInstant.java
@@ -16,7 +16,7 @@
  */
 package org.apache.logging.log4j.core.time;
 
-import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 
 import java.io.Serializable;
 import java.time.temporal.ChronoField;
@@ -27,10 +27,7 @@ import java.time.temporal.TemporalQuery;
 import java.time.temporal.UnsupportedTemporalTypeException;
 import java.time.temporal.ValueRange;
 
-import static java.time.temporal.ChronoField.INSTANT_SECONDS;
-import static java.time.temporal.ChronoField.MICRO_OF_SECOND;
-import static java.time.temporal.ChronoField.MILLI_OF_SECOND;
-import static java.time.temporal.ChronoField.NANO_OF_SECOND;
+import static java.time.temporal.ChronoField.*;
 import static java.time.temporal.ChronoUnit.NANOS;
 
 /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemClock.java
index d09537c2b3..7f77935d59 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/SystemClock.java
@@ -21,7 +21,7 @@ import java.time.Instant;
 import org.apache.logging.log4j.core.time.Clock;
 import org.apache.logging.log4j.core.time.MutableInstant;
 import org.apache.logging.log4j.core.time.PreciseClock;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Implementation of the {@code Clock} interface that returns the system time.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BasicAuthorizationProvider.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BasicAuthorizationProvider.java
index 793fbc2b87..33b3a408a7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BasicAuthorizationProvider.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BasicAuthorizationProvider.java
@@ -18,8 +18,8 @@ package org.apache.logging.log4j.core.util;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 import java.net.URLConnection;
 import java.util.Base64;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java
index e87d2d8297..d1ffcd28fc 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Constants.java
@@ -19,10 +19,10 @@ package org.apache.logging.log4j.core.util;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.plugins.Named;
 import org.apache.logging.log4j.plugins.di.Key;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
-import static org.apache.logging.log4j.util.Constants.isThreadLocalsEnabled;
+import static org.apache.logging.log4j.util3.Constants.isThreadLocalsEnabled;
 
 /**
  * Log4j Constants.
@@ -102,7 +102,7 @@ public final class Constants {
      * is present in the classpath.
      */
     @Deprecated(forRemoval = true)
-    public static final boolean IS_WEB_APP = org.apache.logging.log4j.util.Constants.isWebApp();
+    public static final boolean IS_WEB_APP = org.apache.logging.log4j.util3.Constants.isWebApp();
 
     /**
      * Kill switch for object pooling in ThreadLocals that enables much of the LOG4J2-1270 no-GC behaviour.
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java
index 724a28ac13..ba72e8496d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/Loader.java
@@ -18,8 +18,8 @@ package org.apache.logging.log4j.core.util;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.io.InputStream;
 import java.lang.reflect.InvocationTargetException;
@@ -58,7 +58,7 @@ public final class Loader {
      * available.
      *
      * @return the TCCL.
-     * @see org.apache.logging.log4j.util.LoaderUtil#getThreadContextClassLoader()
+     * @see LoaderUtil#getThreadContextClassLoader()
      */
     public static ClassLoader getThreadContextClassLoader() {
         return LoaderUtil.getThreadContextClassLoader();
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java
index ad1d1f6580..74ae18d9e4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/OptionConverter.java
@@ -16,18 +16,18 @@
  */
 package org.apache.logging.log4j.core.util;
 
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+
 import java.io.InterruptedIOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Properties;
 
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
-import org.apache.logging.log4j.util.Strings;
-
 /**
  * A convenience class to convert property values to specific types.
  */
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/UuidUtil.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/UuidUtil.java
index cf83095bc8..557f943c00 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/UuidUtil.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/UuidUtil.java
@@ -24,7 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Generates a unique ID. The generated UUID will be unique for approximately 8,925 years so long as
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatchManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatchManager.java
index 457da9181d..787d8afe97 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatchManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/WatchManager.java
@@ -37,7 +37,7 @@ import org.apache.logging.log4j.core.config.ConfigurationScheduler;
 import org.apache.logging.log4j.plugins.Inject;
 import org.apache.logging.log4j.plugins.Singleton;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.ServiceRegistry;
+import org.apache.logging.log4j.util3.ServiceRegistry;
 
 /**
  * Manages {@link FileWatcher}s.
diff --git a/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java b/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
index ae8994ea51..61c0ace36e 100644
--- a/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
+++ b/log4j-couchdb/src/main/java/org/apache/logging/log4j/couchdb/CouchDbProvider.java
@@ -28,8 +28,8 @@ import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
 import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.LoaderUtil;
 import org.lightcouch.CouchDbClient;
 import org.lightcouch.CouchDbProperties;
 
diff --git a/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java b/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
index 385100d519..7129e59127 100644
--- a/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
+++ b/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
@@ -27,8 +27,8 @@ import org.apache.logging.log4j.docker.model.Container;
 import org.apache.logging.log4j.docker.model.Network;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.io.IOException;
 import java.net.URL;
diff --git a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java
index c20dcfbf18..b3de5ad559 100644
--- a/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java
+++ b/log4j-flume-ng/src/main/java/org/apache/logging/log4j/flume/appender/FlumeEmbeddedManager.java
@@ -16,11 +16,6 @@
  */
 package org.apache.logging.log4j.flume.appender;
 
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
 import org.apache.flume.Event;
 import org.apache.flume.EventDeliveryException;
 import org.apache.flume.agent.embedded.EmbeddedAgent;
@@ -28,9 +23,14 @@ import org.apache.logging.log4j.LoggingException;
 import org.apache.logging.log4j.core.appender.ManagerFactory;
 import org.apache.logging.log4j.core.config.ConfigurationException;
 import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.util.NameUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.NameUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  *
diff --git a/log4j-gctests/src/test/java/org/apache/logging/log4j/gctests/GcFreeLoggingTestUtil.java b/log4j-gctests/src/test/java/org/apache/logging/log4j/gctests/GcFreeLoggingTestUtil.java
index b98120292f..9548bd0731 100644
--- a/log4j-gctests/src/test/java/org/apache/logging/log4j/gctests/GcFreeLoggingTestUtil.java
+++ b/log4j-gctests/src/test/java/org/apache/logging/log4j/gctests/GcFreeLoggingTestUtil.java
@@ -37,8 +37,8 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Pattern;
 
 import static java.lang.System.getProperty;
-import static org.apache.logging.log4j.util.Constants.isThreadLocalsEnabled;
-import static org.apache.logging.log4j.util.Constants.isWebApp;
+import static org.apache.logging.log4j.util3.Constants.isThreadLocalsEnabled;
+import static org.apache.logging.log4j.util3.Constants.isWebApp;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
diff --git a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/IoBuilder.java b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/IoBuilder.java
index 08d75d4fde..c76a4979b4 100644
--- a/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/IoBuilder.java
+++ b/log4j-iostreams/src/main/java/org/apache/logging/log4j/io/IoBuilder.java
@@ -16,6 +16,14 @@
  */
 package org.apache.logging.log4j.io;
 
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.LoggingException;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.spi.ExtendedLogger;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
+
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PrintStream;
@@ -26,14 +34,6 @@ import java.io.Writer;
 import java.nio.charset.Charset;
 import java.util.Objects;
 
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LoggingException;
-import org.apache.logging.log4j.Marker;
-import org.apache.logging.log4j.spi.ExtendedLogger;
-import org.apache.logging.log4j.util.StackLocatorUtil;
-
 /**
  * Builder class to wrap {@link Logger Loggers} into Java IO compatible classes.
  *
diff --git a/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jWebInitializerImpl.java b/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jWebInitializerImpl.java
index b56270b4d0..f370ee0ea5 100644
--- a/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jWebInitializerImpl.java
+++ b/log4j-jakarta-web/src/main/java/org/apache/logging/log4j/web/Log4jWebInitializerImpl.java
@@ -32,13 +32,18 @@ import org.apache.logging.log4j.core.selector.NamedContextSelector;
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.core.util.NetUtils;
 import org.apache.logging.log4j.spi.LoggerContextFactory;
-import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 import java.net.URI;
 import java.net.URL;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 
diff --git a/log4j-jakarta-web/src/test/java/org/apache/logging/log4j/web/PropertyTest.java b/log4j-jakarta-web/src/test/java/org/apache/logging/log4j/web/PropertyTest.java
index bb5dc6296e..713be7fefb 100644
--- a/log4j-jakarta-web/src/test/java/org/apache/logging/log4j/web/PropertyTest.java
+++ b/log4j-jakarta-web/src/test/java/org/apache/logging/log4j/web/PropertyTest.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.web;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.impl.Log4jContextFactory;
-import org.apache.logging.log4j.util.Constants;
+import org.apache.logging.log4j.util3.Constants;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
diff --git a/log4j-jcl/src/main/java/org/apache/logging/log4j/jcl/LogAdapter.java b/log4j-jcl/src/main/java/org/apache/logging/log4j/jcl/LogAdapter.java
index 94e80f1a74..5a5d1b9f79 100644
--- a/log4j-jcl/src/main/java/org/apache/logging/log4j/jcl/LogAdapter.java
+++ b/log4j-jcl/src/main/java/org/apache/logging/log4j/jcl/LogAdapter.java
@@ -21,7 +21,7 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.spi.AbstractLoggerAdapter;
 import org.apache.logging.log4j.spi.LoggerContext;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 
 /**
  * Commons Logging adapter registry.
diff --git a/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/ColumnConfigTest.java b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/ColumnConfigTest.java
index 62c01fb8e5..2b5c63dd56 100644
--- a/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/ColumnConfigTest.java
+++ b/log4j-jdbc/src/test/java/org/apache/logging/log4j/jdbc/appender/ColumnConfigTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.logging.log4j.jdbc.appender;
 
-import org.apache.logging.log4j.jdbc.appender.ColumnConfig;
 import org.apache.logging.log4j.util.Strings;
 import org.junit.Test;
 
diff --git a/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqManager.java b/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqManager.java
index 4aeb712134..7c47371fbb 100644
--- a/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqManager.java
+++ b/log4j-jeromq/src/main/java/org/apache/logging/log4j/jeromq/appender/JeroMqManager.java
@@ -17,18 +17,18 @@
 
 package org.apache.logging.log4j.jeromq.appender;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.appender.AbstractManager;
 import org.apache.logging.log4j.core.appender.ManagerFactory;
 import org.apache.logging.log4j.core.util.Cancellable;
 import org.apache.logging.log4j.core.util.ShutdownCallbackRegistry;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.zeromq.ZMQ;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
 /**
  * Manager for publishing messages via JeroMq.
  *
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaAppender.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaAppender.java
index 34009c7aba..c12fde0912 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaAppender.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/appender/JpaAppender.java
@@ -28,8 +28,8 @@ import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
-import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 import java.lang.reflect.Constructor;
 
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverter.java
index 26170ff270..7642f9ba64 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverter.java
@@ -16,23 +16,21 @@
  */
 package org.apache.logging.log4j.jpa.converter;
 
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.Map;
-import javax.persistence.AttributeConverter;
-import javax.persistence.Converter;
-import javax.persistence.PersistenceException;
-
-import org.apache.logging.log4j.util.ReadOnlyStringMap;
-import org.apache.logging.log4j.core.impl.ContextDataFactory;
-import org.apache.logging.log4j.util.StringMap;
-import org.apache.logging.log4j.util.BiConsumer;
-import org.apache.logging.log4j.util.Strings;
-
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.logging.log4j.core.impl.ContextDataFactory;
+import org.apache.logging.log4j.util.ReadOnlyStringMap;
+import org.apache.logging.log4j.util.StringMap;
+import org.apache.logging.log4j.util.Strings;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+import javax.persistence.PersistenceException;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
 
 /**
  * A JPA 2.1 attribute converter for {@link ReadOnlyStringMap}s in
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ThrowableAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ThrowableAttributeConverter.java
index 0a3b876836..5aa5657570 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ThrowableAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ThrowableAttributeConverter.java
@@ -26,7 +26,7 @@ import java.util.ListIterator;
 import javax.persistence.AttributeConverter;
 import javax.persistence.Converter;
 
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 import org.apache.logging.log4j.util.Strings;
 
 /**
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/AbstractJpaAppenderTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/AbstractJpaAppenderTest.java
index 49112475bc..744e9f8008 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/AbstractJpaAppenderTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/AbstractJpaAppenderTest.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.core.config.ConfigurationFactory;
 import org.apache.logging.log4j.core.config.DefaultConfiguration;
 import org.apache.logging.log4j.core.test.categories.Appenders;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
diff --git a/log4j-jpl/src/main/java/org/apache/logging/log4j/jpl/Log4jSystemLoggerAdapter.java b/log4j-jpl/src/main/java/org/apache/logging/log4j/jpl/Log4jSystemLoggerAdapter.java
index d6df19e524..c01e30ba18 100644
--- a/log4j-jpl/src/main/java/org/apache/logging/log4j/jpl/Log4jSystemLoggerAdapter.java
+++ b/log4j-jpl/src/main/java/org/apache/logging/log4j/jpl/Log4jSystemLoggerAdapter.java
@@ -17,13 +17,13 @@
 
 package org.apache.logging.log4j.jpl;
 
-import java.lang.System.Logger;
-import java.lang.System.LoggerFinder;
-
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.spi.AbstractLoggerAdapter;
 import org.apache.logging.log4j.spi.LoggerContext;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
+
+import java.lang.System.Logger;
+import java.lang.System.LoggerFinder;
 
 /**
  * {@link Logger} registry implementation using just log4j-api.
diff --git a/log4j-jul/src/main/java/org/apache/logging/log4j/jul/AbstractLoggerAdapter.java b/log4j-jul/src/main/java/org/apache/logging/log4j/jul/AbstractLoggerAdapter.java
index 9337642f73..961a219718 100644
--- a/log4j-jul/src/main/java/org/apache/logging/log4j/jul/AbstractLoggerAdapter.java
+++ b/log4j-jul/src/main/java/org/apache/logging/log4j/jul/AbstractLoggerAdapter.java
@@ -16,11 +16,11 @@
  */
 package org.apache.logging.log4j.jul;
 
-import java.util.logging.Logger;
-
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.spi.LoggerContext;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
+
+import java.util.logging.Logger;
 
 /**
  * Abstract Logger registry. Due to the optionality of using log4j-core, there are two registries available at runtime
diff --git a/log4j-jul/src/main/java/org/apache/logging/log4j/jul/LevelTranslator.java b/log4j-jul/src/main/java/org/apache/logging/log4j/jul/LevelTranslator.java
index 328e1e56ca..35117ef5bc 100644
--- a/log4j-jul/src/main/java/org/apache/logging/log4j/jul/LevelTranslator.java
+++ b/log4j-jul/src/main/java/org/apache/logging/log4j/jul/LevelTranslator.java
@@ -20,8 +20,8 @@ package org.apache.logging.log4j.jul;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Utility class to convert between JDK Levels and Log4j 2 Levels.
diff --git a/log4j-jul/src/main/java/org/apache/logging/log4j/jul/LogManager.java b/log4j-jul/src/main/java/org/apache/logging/log4j/jul/LogManager.java
index 6225b4c00e..7767e0aa5d 100644
--- a/log4j-jul/src/main/java/org/apache/logging/log4j/jul/LogManager.java
+++ b/log4j-jul/src/main/java/org/apache/logging/log4j/jul/LogManager.java
@@ -16,17 +16,17 @@
  */
 package org.apache.logging.log4j.jul;
 
+import org.apache.logging.log4j.LoggingException;
+import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util3.LoaderUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.logging.Logger;
 
-import org.apache.logging.log4j.LoggingException;
-import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
-
 /**
  * Log4j implementation of {@link java.util.logging.LogManager}. Note that the system property
  * {@code java.util.logging.manager} must be set to {@code org.apache.logging.log4j.jul.LogManager} in order to use
diff --git a/log4j-kubernetes/src/main/java/org/apache/logging/log4j/kubernetes/KubernetesClientProperties.java b/log4j-kubernetes/src/main/java/org/apache/logging/log4j/kubernetes/KubernetesClientProperties.java
index 7fd7db1903..acf1afa93a 100644
--- a/log4j-kubernetes/src/main/java/org/apache/logging/log4j/kubernetes/KubernetesClientProperties.java
+++ b/log4j-kubernetes/src/main/java/org/apache/logging/log4j/kubernetes/KubernetesClientProperties.java
@@ -16,11 +16,11 @@
  */
 package org.apache.logging.log4j.kubernetes;
 
-import java.time.Duration;
-
-import org.apache.logging.log4j.util.PropertiesUtil;
-
 import io.fabric8.kubernetes.client.Config;
+import org.apache.logging.log4j.util.PropertyEnvironment;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+
+import java.time.Duration;
 
 /**
  * Obtains properties used to configure the Kubernetes client.
@@ -54,7 +54,7 @@ public class KubernetesClientProperties {
     private static final String WATCH_RECONNECT_INTERVAL = "watchReconnectInterval";
     private static final String WATCH_RECONNECT_LIMIT = "watchReconnectLimit";
 
-    private final PropertiesUtil props = PropertiesUtil.getProperties();
+    private final PropertyEnvironment props = PropertiesUtil.getProperties();
     private final Config base;
 
     public KubernetesClientProperties(Config base) {
diff --git a/log4j-kubernetes/src/main/java/org/apache/logging/log4j/kubernetes/KubernetesLookup.java b/log4j-kubernetes/src/main/java/org/apache/logging/log4j/kubernetes/KubernetesLookup.java
index c66347b440..c6645eaa6b 100644
--- a/log4j-kubernetes/src/main/java/org/apache/logging/log4j/kubernetes/KubernetesLookup.java
+++ b/log4j-kubernetes/src/main/java/org/apache/logging/log4j/kubernetes/KubernetesLookup.java
@@ -28,8 +28,8 @@ import org.apache.logging.log4j.core.lookup.AbstractLookup;
 import org.apache.logging.log4j.core.lookup.Lookup;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 import java.net.URL;
 import java.nio.file.Paths;
diff --git a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
index bd2a2a9f46..42a31322ab 100644
--- a/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
+++ b/log4j-layout-template-json-test/src/test/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutTest.java
@@ -51,7 +51,6 @@ import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginFactory;
 import org.apache.logging.log4j.util.Strings;
-import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.io.ByteArrayOutputStream;
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
index e75066ae96..ed0dd56348 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
@@ -18,8 +18,8 @@ package org.apache.logging.log4j.layout.template.json;
 
 import org.apache.logging.log4j.layout.template.json.util.RecyclerFactories;
 import org.apache.logging.log4j.layout.template.json.util.RecyclerFactory;
-import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.PropertyEnvironment;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/RecyclerFactories.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/RecyclerFactories.java
index 382c40ae26..6fd8f541ec 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/RecyclerFactories.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/RecyclerFactories.java
@@ -16,7 +16,7 @@
  */
 package org.apache.logging.log4j.layout.template.json.util;
 
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 import org.jctools.queues.MpmcArrayQueue;
 
 import java.lang.reflect.Constructor;
@@ -28,7 +28,7 @@ import java.util.Queue;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.function.Supplier;
 
-import static org.apache.logging.log4j.util.Constants.isThreadLocalsEnabled;
+import static org.apache.logging.log4j.util3.Constants.isThreadLocalsEnabled;
 
 public final class RecyclerFactories {
 
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/Uris.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/Uris.java
index c78335039b..41031fa8af 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/Uris.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/util/Uris.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.layout.template.json.util;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 import java.io.BufferedReader;
 import java.io.IOException;
diff --git a/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDb3Provider.java b/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDb3Provider.java
index dea6259c92..ff6a6abc60 100644
--- a/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDb3Provider.java
+++ b/log4j-mongodb3/src/main/java/org/apache/logging/log4j/mongodb3/MongoDb3Provider.java
@@ -23,11 +23,9 @@ import com.mongodb.ServerAddress;
 import com.mongodb.WriteConcern;
 import com.mongodb.client.MongoDatabase;
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.Core;
 import org.apache.logging.log4j.core.appender.nosql.NoSqlProvider;
 import org.apache.logging.log4j.core.filter.AbstractFilterable;
 import org.apache.logging.log4j.plugins.Configurable;
-import org.apache.logging.log4j.plugins.Namespace;
 import org.apache.logging.log4j.plugins.Inject;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
@@ -39,8 +37,8 @@ import org.apache.logging.log4j.plugins.validation.constraints.Required;
 import org.apache.logging.log4j.plugins.validation.constraints.ValidHost;
 import org.apache.logging.log4j.plugins.validation.constraints.ValidPort;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.LoaderUtil;
 import org.bson.codecs.configuration.CodecRegistries;
 import org.bson.codecs.configuration.CodecRegistry;
 
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AnnotationVsMarkerInterface.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AnnotationVsMarkerInterface.java
index eae2c48ed0..4077f6ba19 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AnnotationVsMarkerInterface.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/AnnotationVsMarkerInterface.java
@@ -17,12 +17,10 @@
 
 package org.apache.logging.log4j.perf.jmh;
 
-import java.util.concurrent.TimeUnit;
-
-import org.apache.logging.log4j.util.PerformanceSensitive;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringBuilderFormattable;
 import org.apache.logging.log4j.util.StringMap;
+import org.apache.logging.log4j.util3.PerformanceSensitive;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
 import org.openjdk.jmh.annotations.Fork;
@@ -33,6 +31,8 @@ import org.openjdk.jmh.annotations.Scope;
 import org.openjdk.jmh.annotations.State;
 import org.openjdk.jmh.annotations.Warmup;
 
+import java.util.concurrent.TimeUnit;
+
 /**
  * Tests performance of marker interface vs annotation.
  */
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ReflectionBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ReflectionBenchmark.java
index 3adb5dbc2e..e660bb048f 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ReflectionBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ReflectionBenchmark.java
@@ -16,19 +16,19 @@
  */
 package org.apache.logging.log4j.perf.jmh;
 
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Random;
-
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.StringFormattedMessage;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.Level;
 import org.openjdk.jmh.annotations.Scope;
 import org.openjdk.jmh.annotations.Setup;
 import org.openjdk.jmh.annotations.State;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Random;
+
 /**
  * <p>
  * Benchmarks the different ways the caller class can be obtained. To run this in sampling mode (latency test):
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java
index 047da75410..c24d91d994 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java
@@ -24,7 +24,6 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.logging.log4j.perf.nogc.OpenHashStringMap;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
-import org.apache.logging.log4j.util.BiConsumer;
 import org.apache.logging.log4j.util.TriConsumer;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StringBuilderEscapeBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StringBuilderEscapeBenchmark.java
index 865f925021..b5bf2d32a3 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StringBuilderEscapeBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StringBuilderEscapeBenchmark.java
@@ -17,7 +17,7 @@
 
 package org.apache.logging.log4j.perf.jmh;
 
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.StringBuilders;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
 import org.openjdk.jmh.annotations.Mode;
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteOpenHashMapThreadContextMap.java b/log4j-perf/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteOpenHashMapThreadContextMap.java
index c1ace7a14f..f8c6c1fba5 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteOpenHashMapThreadContextMap.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteOpenHashMapThreadContextMap.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.spi;
 import org.apache.logging.log4j.perf.nogc.OpenHashStringMap;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.StringMap;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * {@code OpenHashStringMap}-based implementation of the {@code ThreadContextMap} interface that creates a copy of
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/spi/GarbageFreeOpenHashMapThreadContextMap.java b/log4j-perf/src/main/java/org/apache/logging/log4j/spi/GarbageFreeOpenHashMapThreadContextMap.java
index 80b658f011..fbd62d5d91 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/spi/GarbageFreeOpenHashMapThreadContextMap.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/spi/GarbageFreeOpenHashMapThreadContextMap.java
@@ -19,7 +19,7 @@ package org.apache.logging.log4j.spi;
 import org.apache.logging.log4j.perf.nogc.OpenHashStringMap;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.StringMap;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * {@code OpenHashStringMap}-based implementation of the {@code ThreadContextMap} interface that attempts not to
diff --git a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/condition/OnPropertyConditionTest.java b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/condition/OnPropertyConditionTest.java
index 1c3d010575..689509da51 100644
--- a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/condition/OnPropertyConditionTest.java
+++ b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/condition/OnPropertyConditionTest.java
@@ -20,7 +20,7 @@ package org.apache.logging.log4j.plugins.condition;
 import org.apache.logging.log4j.plugins.Factory;
 import org.apache.logging.log4j.plugins.Ordered;
 import org.apache.logging.log4j.plugins.di.DI;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junitpioneer.jupiter.ClearSystemProperty;
diff --git a/log4j-plugins/pom.xml b/log4j-plugins/pom.xml
index 6658e2c1e9..7d5cb5c3b3 100644
--- a/log4j-plugins/pom.xml
+++ b/log4j-plugins/pom.xml
@@ -64,6 +64,7 @@
               org.apache.logging.log4j,
               org.apache.logging.log4j.status,
               org.apache.logging.log4j.util,
+              org.apache.logging.log4j.util3,
               org.osgi.framework.*
             </Import-Package>
             <Bundle-Activator>org.apache.logging.log4j.plugins.osgi.Activator</Bundle-Activator>
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/condition/OnPropertyCondition.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/condition/OnPropertyCondition.java
index 9c145b071b..f60abc6403 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/condition/OnPropertyCondition.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/condition/OnPropertyCondition.java
@@ -22,7 +22,7 @@ import org.apache.logging.log4j.plugins.Singleton;
 import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.plugins.util.AnnotationUtil;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 import java.lang.reflect.AnnotatedElement;
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
index fd8012a728..32916481ce 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/convert/EnumConverter.java
@@ -16,7 +16,7 @@
  */
 package org.apache.logging.log4j.plugins.convert;
 
-import org.apache.logging.log4j.util.EnglishEnums;
+import org.apache.logging.log4j.util3.EnglishEnums;
 
 /**
  * Converts a {@link String} into a {@link Enum}. Returns {@code null} for invalid enum names.
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInjector.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInjector.java
index 6d1d28d8f9..8ac83cd57f 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInjector.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/di/DefaultInjector.java
@@ -39,10 +39,10 @@ import org.apache.logging.log4j.plugins.validation.ConstraintValidationException
 import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
 import org.apache.logging.log4j.plugins.visit.NodeVisitor;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.EnglishEnums;
 import org.apache.logging.log4j.util.Lazy;
-import org.apache.logging.log4j.util.ServiceRegistry;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.EnglishEnums;
+import org.apache.logging.log4j.util3.ServiceRegistry;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.annotation.Annotation;
 import java.lang.invoke.MethodHandles;
@@ -705,7 +705,7 @@ class DefaultInjector implements Injector {
         return false;
     }
 
-    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @SuppressWarnings({"unchecked", "rawtypes"})
     private static void initializeConstraintValidator(
             final ConstraintValidator<? extends Annotation> validator, final Annotation annotation) {
         // runtime type checking ensures this raw type usage is correct
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginNamespace.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginNamespace.java
index 2004c4cf23..f29778fb73 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginNamespace.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginNamespace.java
@@ -29,8 +29,6 @@ import java.util.LinkedHashMap;
 import java.util.Locale;
 import java.util.Map;
 import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.function.Predicate;
 
 /**
  * Plugin namespaces are mappings of plugin keys to plugin classes where plugin keys are lower-cased
@@ -141,11 +139,4 @@ public class PluginNamespace extends AbstractCollection<PluginType<?>> {
         plugins.forEach(biConsumer);
     }
 
-    public void forEachMatching(
-            final Predicate<? super PluginType<?>> predicate, final Consumer<? super PluginType<?>> consumer) {
-        plugins.values()
-                .stream()
-                .filter(predicate)
-                .forEach(consumer);
-    }
 }
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginRegistry.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginRegistry.java
index 0d4a4bbb00..9a11016b4b 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginRegistry.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/model/PluginRegistry.java
@@ -26,8 +26,8 @@ import org.apache.logging.log4j.plugins.di.Keys;
 import org.apache.logging.log4j.plugins.util.ResolverUtil;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Lazy;
-import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 import java.io.IOException;
 import java.net.URI;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
index 802cce355e..ce14d013a6 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/ResolverUtil.java
@@ -17,7 +17,7 @@
 package org.apache.logging.log4j.plugins.util;
 
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.wiring.BundleWiring;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredClassValidator.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredClassValidator.java
index 886f7676e1..dabf2e29fc 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredClassValidator.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredClassValidator.java
@@ -20,7 +20,7 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
 import org.apache.logging.log4j.plugins.validation.constraints.RequiredClass;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 /**
  * Validator that checks for the existence of a class that is required.
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredPropertyValidator.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredPropertyValidator.java
index 1bc954f034..139048aeb4 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredPropertyValidator.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/validation/validators/RequiredPropertyValidator.java
@@ -20,7 +20,7 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.plugins.validation.ConstraintValidator;
 import org.apache.logging.log4j.plugins.validation.constraints.RequiredProperty;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Validator that checks that a property exists and has the correct value if a value is required.
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginAttributeVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginAttributeVisitor.java
index ad2242a20c..ed9ab7f580 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginAttributeVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginAttributeVisitor.java
@@ -24,8 +24,8 @@ import org.apache.logging.log4j.plugins.PluginAttribute;
 import org.apache.logging.log4j.plugins.convert.TypeConverter;
 import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.plugins.di.Keys;
-import org.apache.logging.log4j.util.StringBuilders;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Parameter;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginBuilderAttributeVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginBuilderAttributeVisitor.java
index 9e32d6a8a4..2216f9389a 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginBuilderAttributeVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginBuilderAttributeVisitor.java
@@ -24,7 +24,7 @@ import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.convert.TypeConverter;
 import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.plugins.di.Keys;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Field;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginElementVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginElementVisitor.java
index 7ba46eecc5..d1aa9d94a2 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginElementVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginElementVisitor.java
@@ -23,8 +23,8 @@ import org.apache.logging.log4j.plugins.di.Keys;
 import org.apache.logging.log4j.plugins.model.PluginType;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.StringBuilders;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.reflect.Array;
 import java.lang.reflect.Field;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginNodeVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginNodeVisitor.java
index 79e8ad8196..ba788fd651 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginNodeVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginNodeVisitor.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.StringBuilders;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Parameter;
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginValueVisitor.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginValueVisitor.java
index 6d528e9ee9..391832d889 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginValueVisitor.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/visit/PluginValueVisitor.java
@@ -24,8 +24,8 @@ import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.plugins.di.Keys;
 import org.apache.logging.log4j.plugins.util.TypeUtil;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.StringBuilders;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.StringBuilders;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Parameter;
diff --git a/log4j-samples/log4j-samples-configuration/src/main/java/org/apache/logging/log4j/configuration/CustomConfiguration.java b/log4j-samples/log4j-samples-configuration/src/main/java/org/apache/logging/log4j/configuration/CustomConfiguration.java
index 1e80d77ce5..620b80d42f 100644
--- a/log4j-samples/log4j-samples-configuration/src/main/java/org/apache/logging/log4j/configuration/CustomConfiguration.java
+++ b/log4j-samples/log4j-samples-configuration/src/main/java/org/apache/logging/log4j/configuration/CustomConfiguration.java
@@ -16,8 +16,6 @@
  */
 package org.apache.logging.log4j.configuration;
 
-import java.io.Serializable;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Layout;
@@ -27,7 +25,9 @@ import org.apache.logging.log4j.core.config.AbstractConfiguration;
 import org.apache.logging.log4j.core.config.ConfigurationSource;
 import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.layout.PatternLayout;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
+
+import java.io.Serializable;
 
 /**
  * This Configuration is the same as the DefaultConfiguration but shows how a custom configuration can be built
diff --git a/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptManagerImpl.java b/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptManagerImpl.java
index 53ef67548a..243dd6eb0c 100644
--- a/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptManagerImpl.java
+++ b/log4j-script/src/main/java/org/apache/logging/log4j/script/ScriptManagerImpl.java
@@ -48,7 +48,7 @@ import org.apache.logging.log4j.core.util.WatchManager;
 import org.apache.logging.log4j.plugins.Node;
 import org.apache.logging.log4j.script.factory.ScriptManagerFactoryImpl;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.apache.logging.log4j.util.Strings;
 
 /**
diff --git a/log4j-script/src/main/java/org/apache/logging/log4j/script/factory/ScriptManagerFactoryImpl.java b/log4j-script/src/main/java/org/apache/logging/log4j/script/factory/ScriptManagerFactoryImpl.java
index d2272e89dc..a605d68a09 100644
--- a/log4j-script/src/main/java/org/apache/logging/log4j/script/factory/ScriptManagerFactoryImpl.java
+++ b/log4j-script/src/main/java/org/apache/logging/log4j/script/factory/ScriptManagerFactoryImpl.java
@@ -20,11 +20,10 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.script.ScriptManager;
 import org.apache.logging.log4j.core.script.ScriptManagerFactory;
-import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.core.util.WatchManager;
 import org.apache.logging.log4j.script.ScriptManagerImpl;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 
 /**
  * Creates a ScriptManager.
diff --git a/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/Log4jLogger.java b/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/Log4jLogger.java
index 39cb2e739f..55141b34c8 100644
--- a/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/Log4jLogger.java
+++ b/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/Log4jLogger.java
@@ -16,22 +16,22 @@
  */
 package org.apache.logging.slf4j;
 
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.ParameterizedMessage;
 import org.apache.logging.log4j.message.SimpleMessage;
 import org.apache.logging.log4j.spi.ExtendedLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 import org.slf4j.Marker;
 import org.slf4j.MarkerFactory;
 import org.slf4j.spi.LocationAwareLogger;
 
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+
 /**
  * SLF4J logger implementation that uses Log4j.
  */
diff --git a/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/Log4jLoggerFactory.java b/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/Log4jLoggerFactory.java
index f1733013b9..0094115c41 100644
--- a/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/Log4jLoggerFactory.java
+++ b/log4j-slf4j-impl/src/main/java/org/apache/logging/slf4j/Log4jLoggerFactory.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.LoggingException;
 import org.apache.logging.log4j.spi.AbstractLoggerAdapter;
 import org.apache.logging.log4j.spi.LoggerContext;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 import org.slf4j.ILoggerFactory;
 import org.slf4j.Logger;
 
diff --git a/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jLoggerFactory.java b/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jLoggerFactory.java
index f1733013b9..0094115c41 100644
--- a/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jLoggerFactory.java
+++ b/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jLoggerFactory.java
@@ -21,7 +21,7 @@ import org.apache.logging.log4j.LoggingException;
 import org.apache.logging.log4j.spi.AbstractLoggerAdapter;
 import org.apache.logging.log4j.spi.LoggerContext;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.StackLocatorUtil;
+import org.apache.logging.log4j.util3.StackLocatorUtil;
 import org.slf4j.ILoggerFactory;
 import org.slf4j.Logger;
 
diff --git a/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
index aa5b048911..433fb90739 100644
--- a/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
+++ b/log4j-smtp/src/main/java/org/apache/logging/log4j/smtp/appender/SmtpManager.java
@@ -43,17 +43,13 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AbstractManager;
 import org.apache.logging.log4j.core.appender.ManagerFactory;
 import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.impl.Log4jLogEvent;
-import org.apache.logging.log4j.core.impl.MutableLogEvent;
 import org.apache.logging.log4j.core.layout.AbstractStringLayout.Serializer;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
 import org.apache.logging.log4j.core.util.CyclicBuffer;
-import org.apache.logging.log4j.util.NameUtil;
 import org.apache.logging.log4j.core.util.NetUtils;
-import org.apache.logging.log4j.message.ReusableMessage;
 import org.apache.logging.log4j.smtp.MimeMessageBuilder;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.apache.logging.log4j.util.Strings;
 
 /**
diff --git a/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/Log4j2SpringBootLoggingSystem.java b/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/Log4j2SpringBootLoggingSystem.java
index 062fc02ef9..a4765c4b88 100644
--- a/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/Log4j2SpringBootLoggingSystem.java
+++ b/log4j-spring-boot/src/main/java/org/apache/logging/log4j/spring/boot/Log4j2SpringBootLoggingSystem.java
@@ -30,7 +30,7 @@ import org.apache.logging.log4j.core.net.ssl.SslConfigurationFactory;
 import org.apache.logging.log4j.core.util.AuthorizationProvider;
 import org.apache.logging.log4j.core.util.FileUtils;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util3.PropertiesUtil;
 import org.springframework.boot.logging.LogFile;
 import org.springframework.boot.logging.LoggingInitializationContext;
 import org.springframework.boot.logging.LoggingSystem;
@@ -45,7 +45,6 @@ import org.springframework.util.ResourceUtils;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.net.URISyntaxException;
 import java.net.URL;
diff --git a/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULLoggerContextFactory.java b/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULLoggerContextFactory.java
index f44a0d4970..c535b29e78 100644
--- a/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULLoggerContextFactory.java
+++ b/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/JULLoggerContextFactory.java
@@ -16,11 +16,12 @@
  */
 package org.apache.logging.log4j.tojul;
 
-import java.net.URI;
 import org.apache.logging.log4j.spi.LoggerContext;
 import org.apache.logging.log4j.spi.LoggerContextFactory;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
+
+import java.net.URI;
 
 /**
  * Implementation of Log4j {@link LoggerContextFactory} SPI.
diff --git a/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/LazyLog4jLogRecord.java b/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/LazyLog4jLogRecord.java
index f7bce8f68a..d50c15e743 100644
--- a/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/LazyLog4jLogRecord.java
+++ b/log4j-to-jul/src/main/java/org/apache/logging/log4j/tojul/LazyLog4jLogRecord.java
@@ -16,9 +16,10 @@
  */
 package org.apache.logging.log4j.tojul;
 
+import org.apache.logging.log4j.util3.StackLocatorUtil;
+
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
-import org.apache.logging.log4j.util.StackLocatorUtil;
 
 /**
  * Extension of {@link java.util.logging.LogRecord} with lazy get source related methods based on Log4j's {@link StackLocatorUtil#calcLocation(String)}.
@@ -67,4 +68,4 @@ final class LazyLog4jLogRecord extends LogRecord {
         }
         inferCaller = false;
     }
-}
\ No newline at end of file
+}
diff --git a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLoggerContextFactory.java b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLoggerContextFactory.java
index 7de053a7bd..1c9126b2b6 100644
--- a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLoggerContextFactory.java
+++ b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLoggerContextFactory.java
@@ -21,7 +21,7 @@ import java.net.URI;
 import org.apache.logging.log4j.spi.LoggerContext;
 import org.apache.logging.log4j.spi.LoggerContextFactory;
 import org.apache.logging.log4j.status.StatusLogger;
-import org.apache.logging.log4j.util.LoaderUtil;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 /**
  *
diff --git a/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jWebInitializerImpl.java b/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jWebInitializerImpl.java
index 32b08c4040..7950520b9e 100644
--- a/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jWebInitializerImpl.java
+++ b/log4j-web/src/main/java/org/apache/logging/log4j/web/Log4jWebInitializerImpl.java
@@ -31,14 +31,19 @@ import org.apache.logging.log4j.core.selector.NamedContextSelector;
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.core.util.NetUtils;
 import org.apache.logging.log4j.spi.LoggerContextFactory;
-import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.Strings;
+import org.apache.logging.log4j.util3.LoaderUtil;
 
 import javax.servlet.ServletContext;
 import java.net.URI;
 import java.net.URL;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 
diff --git a/log4j-web/src/test/java/org/apache/logging/log4j/web/PropertyTest.java b/log4j-web/src/test/java/org/apache/logging/log4j/web/PropertyTest.java
index bb5dc6296e..713be7fefb 100644
--- a/log4j-web/src/test/java/org/apache/logging/log4j/web/PropertyTest.java
+++ b/log4j-web/src/test/java/org/apache/logging/log4j/web/PropertyTest.java
@@ -18,7 +18,7 @@ package org.apache.logging.log4j.web;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.impl.Log4jContextFactory;
-import org.apache.logging.log4j.util.Constants;
+import org.apache.logging.log4j.util3.Constants;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;


[logging-log4j2] 01/02: Extract PropertyEnvironment interface from PropertiesUtil

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

mattsicker pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 7bb33a00dab31e0c531493e1f375765caa9c461e
Author: Matt Sicker <ma...@apache.org>
AuthorDate: Sun Oct 16 13:47:41 2022 -0500

    Extract PropertyEnvironment interface from PropertiesUtil
    
    Related to https://cwiki.apache.org/confluence/display/LOGGING/Properties+Enhancement
    
    Signed-off-by: Matt Sicker <ma...@apache.org>
---
 .../java/org/apache/logging/log4j/LogManager.java  |   3 +-
 .../org/apache/logging/log4j/ThreadContext.java    |  23 +-
 .../apache/logging/log4j/simple/SimpleLogger.java  |  16 +-
 .../logging/log4j/simple/SimpleLoggerContext.java  |  13 +-
 .../CopyOnWriteSortedArrayThreadContextMap.java    |   3 +-
 .../logging/log4j/spi/DefaultThreadContextMap.java |   3 +-
 .../GarbageFreeSortedArrayThreadContextMap.java    |   3 +-
 .../logging/log4j/spi/ThreadContextMapFactory.java |   5 +-
 .../apache/logging/log4j/status/StatusLogger.java  |  27 +-
 .../apache/logging/log4j/util/PropertiesUtil.java  | 282 ++------------------
 .../logging/log4j/util/PropertyEnvironment.java    | 291 +++++++++++++++++++++
 .../async/AsyncQueueFullPolicyFactoryTest.java     |   4 +-
 .../log4j/core/async/AsyncThreadContextTest.java   |   2 +-
 .../core/impl/ThreadContextDataInjectorTest.java   |  30 +--
 .../log4j/core/appender/ConsoleAppender.java       |   5 +-
 .../core/async/AsyncQueueFullPolicyFactory.java    |   5 +-
 .../log4j/core/config/ConfigurationFactory.java    |   4 +-
 .../core/config/DefaultConfigurationFactory.java   |   3 +-
 .../logging/log4j/core/impl/DefaultBundle.java     |   5 +-
 .../logging/log4j/core/layout/PatternLayout.java   |   7 +-
 .../log4j/core/net/UrlConnectionFactory.java       |  21 +-
 .../core/net/ssl/SslConfigurationFactory.java      |   5 +-
 .../core/util/BasicAuthorizationProvider.java      |  10 +-
 .../apache/logging/log4j/docker/DockerLookup.java  |   3 +-
 .../jpa/appender/AbstractJpaAppenderTest.java      |  20 +-
 .../template/json/JsonTemplateLayoutDefaults.java  |   3 +-
 .../plugins/condition/OnPropertyConditionTest.java |   6 +-
 27 files changed, 431 insertions(+), 371 deletions(-)

diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
index aaf1ba84c8..b3fcb51f18 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/LogManager.java
@@ -28,6 +28,7 @@ import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Lazy;
 import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.ProviderUtil;
 import org.apache.logging.log4j.util.StackLocatorUtil;
 import org.apache.logging.log4j.util.Strings;
@@ -70,7 +71,7 @@ public class LogManager {
      */
     private static final Lazy<LoggerContextFactory> PROVIDER = Lazy.lazy(() -> {
         // Shortcut binding to force a specific logging implementation.
-        final PropertiesUtil managerProps = PropertiesUtil.getProperties();
+        final PropertyEnvironment managerProps = PropertiesUtil.getProperties();
         final String factoryClassName = managerProps.getStringProperty(FACTORY_PROPERTY_NAME);
         if (factoryClassName != null) {
             try {
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java b/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java
index 6f6e8b0748..c61ca0701c 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/ThreadContext.java
@@ -17,26 +17,27 @@
 
 package org.apache.logging.log4j;
 
-import java.io.Serializable;
-import java.util.AbstractCollection;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-
 import org.apache.logging.log4j.message.ParameterizedMessage;
+import org.apache.logging.log4j.spi.CleanableThreadContextMap;
 import org.apache.logging.log4j.spi.DefaultThreadContextMap;
 import org.apache.logging.log4j.spi.DefaultThreadContextStack;
 import org.apache.logging.log4j.spi.NoOpThreadContextMap;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
 import org.apache.logging.log4j.spi.ThreadContextMap;
 import org.apache.logging.log4j.spi.ThreadContextMap2;
-import org.apache.logging.log4j.spi.CleanableThreadContextMap;
 import org.apache.logging.log4j.spi.ThreadContextMapFactory;
 import org.apache.logging.log4j.spi.ThreadContextStack;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
+
+import java.io.Serializable;
+import java.util.AbstractCollection;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
 
 /**
  * The ThreadContext allows applications to store information either in a Map or a Stack.
@@ -212,7 +213,7 @@ public final class ThreadContext {
     public static void init() {
         ThreadContextMapFactory.init();
         contextMap = null;
-        final PropertiesUtil managerProps = PropertiesUtil.getProperties();
+        final PropertyEnvironment managerProps = PropertiesUtil.getProperties();
         final boolean disableAll = managerProps.getBooleanProperty(DISABLE_ALL);
         useStack = !(managerProps.getBooleanProperty(DISABLE_STACK) || disableAll);
         final boolean useMap = !(managerProps.getBooleanProperty(DISABLE_MAP) || disableAll);
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLogger.java b/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLogger.java
index fe21b3a162..53d53473a2 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLogger.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLogger.java
@@ -16,21 +16,21 @@
  */
 package org.apache.logging.log4j.simple;
 
-import java.io.PrintStream;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Map;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.MessageFactory;
 import org.apache.logging.log4j.spi.AbstractLogger;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.Strings;
 
+import java.io.PrintStream;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+
 /**
  * This is the default logger that is used when no suitable logging implementation is available.
  */
@@ -60,7 +60,7 @@ public class SimpleLogger extends AbstractLogger {
 
     public SimpleLogger(final String name, final Level defaultLevel, final boolean showLogName,
             final boolean showShortLogName, final boolean showDateTime, final boolean showContextMap,
-            final String dateTimeFormat, final MessageFactory messageFactory, final PropertiesUtil props,
+            final String dateTimeFormat, final MessageFactory messageFactory, final PropertyEnvironment props,
             final PrintStream stream) {
         super(name, messageFactory);
         final String lvl = props.getStringProperty(SimpleLoggerContext.SYSTEM_PREFIX + name + ".level");
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContext.java b/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContext.java
index ac14f37682..b83ed480a2 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContext.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/simple/SimpleLoggerContext.java
@@ -16,10 +16,6 @@
  */
 package org.apache.logging.log4j.simple;
 
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.PrintStream;
-
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.message.MessageFactory;
 import org.apache.logging.log4j.spi.AbstractLogger;
@@ -27,6 +23,11 @@ import org.apache.logging.log4j.spi.ExtendedLogger;
 import org.apache.logging.log4j.spi.LoggerContext;
 import org.apache.logging.log4j.spi.LoggerRegistry;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
+
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
 
 /**
  * A simple {@link LoggerContext} implementation.
@@ -46,7 +47,7 @@ public class SimpleLoggerContext implements LoggerContext {
     /** All system properties used by <code>SimpleLog</code> start with this */
     protected static final String SYSTEM_PREFIX = "org.apache.logging.log4j.simplelog.";
 
-    private final PropertiesUtil props;
+    private final PropertyEnvironment props;
 
     /** Include the instance name in the log message? */
     private final boolean showLogName;
@@ -76,7 +77,7 @@ public class SimpleLoggerContext implements LoggerContext {
      * Constructs a new initialized instance.
      */
     public SimpleLoggerContext() {
-        props = new PropertiesUtil("log4j2.simplelog.properties");
+        props = PropertiesUtil.getProperties("simplelog");
 
         showContextMap = props.getBooleanProperty(SYSTEM_PREFIX + "showContextMap", false);
         showLogName = props.getBooleanProperty(SYSTEM_PREFIX + "showlogname", false);
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
index b3fa93918c..4c291d830e 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/CopyOnWriteSortedArrayThreadContextMap.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.spi;
 import org.apache.logging.log4j.util.LazyBoolean;
 import org.apache.logging.log4j.util.LazyInt;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringMap;
@@ -66,7 +67,7 @@ class CopyOnWriteSortedArrayThreadContextMap implements ReadOnlyThreadContextMap
      * Initializes static variables based on system properties. Normally called when this class is initialized by the VM
      * and when Log4j is reconfigured.
      */
-    static void init(final PropertiesUtil properties) {
+    static void init(final PropertyEnvironment properties) {
         initialCapacity.setAsInt(properties.getIntegerProperty(PROPERTY_NAME_INITIAL_CAPACITY, DEFAULT_INITIAL_CAPACITY));
         inheritableMap.setAsBoolean(properties.getBooleanProperty(INHERITABLE_MAP));
     }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
index 314db45c4f..7865fef75a 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/DefaultThreadContextMap.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.spi;
 import org.apache.logging.log4j.util.BiConsumer;
 import org.apache.logging.log4j.util.LazyBoolean;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.TriConsumer;
 
@@ -65,7 +66,7 @@ public class DefaultThreadContextMap implements ThreadContextMap, ReadOnlyString
         return new ThreadLocal<>();
     }
 
-    static void init(final PropertiesUtil properties) {
+    static void init(final PropertyEnvironment properties) {
         inheritableMap.setAsBoolean(properties.getBooleanProperty(INHERITABLE_MAP));
     }
     
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
index 28562682dc..108a12a8c6 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/GarbageFreeSortedArrayThreadContextMap.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.spi;
 import org.apache.logging.log4j.util.LazyBoolean;
 import org.apache.logging.log4j.util.LazyInt;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.ReadOnlyStringMap;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringMap;
@@ -66,7 +67,7 @@ class GarbageFreeSortedArrayThreadContextMap implements ReadOnlyThreadContextMap
      * Initializes static variables based on system properties. Normally called when this class is initialized by the VM
      * and when Log4j is reconfigured.
      */
-    static void init(final PropertiesUtil properties) {
+    static void init(final PropertyEnvironment properties) {
         initialCapacity.setAsInt(properties.getIntegerProperty(PROPERTY_NAME_INITIAL_CAPACITY, DEFAULT_INITIAL_CAPACITY));
         inheritableMap.setAsBoolean(properties.getBooleanProperty(INHERITABLE_MAP));
     }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java
index 60d69b35b8..a6f07cc5e0 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/spi/ThreadContextMapFactory.java
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.ThreadContext;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Constants;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.ProviderUtil;
 import org.apache.logging.log4j.util.ReflectionUtil;
 
@@ -63,7 +64,7 @@ public final class ThreadContextMapFactory {
      * and when Log4j is reconfigured.
      */
     public static void init() {
-        final PropertiesUtil properties = PropertiesUtil.getProperties();
+        final PropertyEnvironment properties = PropertiesUtil.getProperties();
         CopyOnWriteSortedArrayThreadContextMap.init(properties);
         GarbageFreeSortedArrayThreadContextMap.init(properties);
         DefaultThreadContextMap.init(properties);
@@ -74,7 +75,7 @@ public final class ThreadContextMapFactory {
      * Initializes static variables based on system properties. Normally called when this class is initialized by the VM
      * and when Log4j is reconfigured.
      */
-    private static void initPrivate(final PropertiesUtil properties) {
+    private static void initPrivate(final PropertyEnvironment properties) {
         ThreadContextMapName = properties.getStringProperty(THREAD_CONTEXT_KEY);
         GcFreeThreadContextKey = properties.getBooleanProperty(GC_FREE_THREAD_CONTEXT_KEY);
     }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
index 86eee2acf3..92e94f9d80 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
@@ -16,6 +16,19 @@
  */
 package org.apache.logging.log4j.status;
 
+import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.message.Message;
+import org.apache.logging.log4j.message.MessageFactory;
+import org.apache.logging.log4j.message.ParameterizedNoReferenceMessageFactory;
+import org.apache.logging.log4j.simple.SimpleLogger;
+import org.apache.logging.log4j.simple.SimpleLoggerContext;
+import org.apache.logging.log4j.spi.AbstractLogger;
+import org.apache.logging.log4j.util.Constants;
+import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
+import org.apache.logging.log4j.util.Strings;
+
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.ArrayList;
@@ -29,18 +42,6 @@ import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.Marker;
-import org.apache.logging.log4j.message.Message;
-import org.apache.logging.log4j.message.MessageFactory;
-import org.apache.logging.log4j.message.ParameterizedNoReferenceMessageFactory;
-import org.apache.logging.log4j.simple.SimpleLogger;
-import org.apache.logging.log4j.simple.SimpleLoggerContext;
-import org.apache.logging.log4j.spi.AbstractLogger;
-import org.apache.logging.log4j.util.Constants;
-import org.apache.logging.log4j.util.PropertiesUtil;
-import org.apache.logging.log4j.util.Strings;
-
 /**
  * Records events that occur in the logging system. By default, only error messages are logged to {@link System#err}.
  * Normally, the Log4j StatusLogger is configured via the root {@code <Configuration status="LEVEL"/>} node in a Log4j
@@ -75,7 +76,7 @@ public final class StatusLogger extends AbstractLogger {
 
     private static final String NOT_AVAIL = "?";
 
-    private static final PropertiesUtil PROPS = new PropertiesUtil("log4j2.StatusLogger.properties");
+    private static final PropertyEnvironment PROPS = PropertiesUtil.getProperties("StatusLogger");
 
     private static final int MAX_ENTRIES = PROPS.getIntegerProperty(MAX_STATUS_ENTRIES, 200);
 
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
index 1f215de209..354edfbffe 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
@@ -19,7 +19,6 @@ package org.apache.logging.log4j.util;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.invoke.MethodHandles;
-import java.nio.charset.Charset;
 import java.time.Duration;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalUnit;
@@ -48,7 +47,7 @@ import java.util.concurrent.ConcurrentSkipListSet;
  *
  * @see PropertySource
  */
-public final class PropertiesUtil {
+public final class PropertiesUtil implements PropertyEnvironment {
 
     private static final String LOG4J_PROPERTIES_FILE_NAME = "log4j2.component.properties";
     private static final String LOG4J_SYSTEM_PROPERTIES_FILE_NAME = "log4j2.system.properties";
@@ -118,14 +117,15 @@ public final class PropertiesUtil {
      *
      * @return the main Log4j PropertiesUtil instance.
      */
-    public static PropertiesUtil getProperties() {
+    public static PropertyEnvironment getProperties() {
         return COMPONENT_PROPERTIES.value();
     }
 
-    /**
-     * Allows a PropertySource to be added after PropertiesUtil has been created.
-     * @param propertySource the PropertySource to add.
-     */
+    public static PropertyEnvironment getProperties(final String namespace) {
+        return new Environment(new PropertyFilePropertySource(String.format("log4j2.%s.properties", namespace)));
+    }
+
+    @Override
     public void addPropertySource(PropertySource propertySource) {
         if (environment != null) {
             environment.addPropertySource(propertySource);
@@ -138,103 +138,9 @@ public final class PropertiesUtil {
      * @param name the name of the property to verify
      * @return {@code true} if the specified property is defined, regardless of its value
      */
+    @Override
     public boolean hasProperty(final String name) {
-        return environment.containsKey(name);
-    }
-
-    /**
-     * Gets the named property as a boolean value. If the property matches the string {@code "true"} (case-insensitive),
-     * then it is returned as the boolean value {@code true}. Any other non-{@code null} text in the property is
-     * considered {@code false}.
-     *
-     * @param name the name of the property to look up
-     * @return the boolean value of the property or {@code false} if undefined.
-     */
-    public boolean getBooleanProperty(final String name) {
-        return getBooleanProperty(name, false);
-    }
-
-    /**
-     * Gets the named property as a boolean value.
-     *
-     * @param name         the name of the property to look up
-     * @param defaultValue the default value to use if the property is undefined
-     * @return the boolean value of the property or {@code defaultValue} if undefined.
-     */
-    public boolean getBooleanProperty(final String name, final boolean defaultValue) {
-        final String prop = getStringProperty(name);
-        return prop == null ? defaultValue : "true".equalsIgnoreCase(prop);
-    }
-
-    /**
-     * Gets the named property as a boolean value.
-     *
-     * @param name                  the name of the property to look up
-     * @param defaultValueIfAbsent  the default value to use if the property is undefined
-     * @param defaultValueIfPresent the default value to use if the property is defined but not assigned
-     * @return the boolean value of the property or {@code defaultValue} if undefined.
-     */
-    public boolean getBooleanProperty(final String name, final boolean defaultValueIfAbsent,
-                                      final boolean defaultValueIfPresent) {
-        final String prop = getStringProperty(name);
-        return prop == null ? defaultValueIfAbsent
-            : prop.isEmpty() ? defaultValueIfPresent : "true".equalsIgnoreCase(prop);
-    }
-
-    /**
-     * Retrieves a property that may be prefixed by more than one string.
-     * @param prefixes The array of prefixes.
-     * @param key The key to locate.
-     * @param supplier The method to call to derive the default value. If the value is null, null will be returned
-     * if no property is found.
-     * @return The value or null if it is not found.
-     * @since 2.13.0
-     */
-    public Boolean getBooleanProperty(final String[] prefixes, final String key, final Supplier<Boolean> supplier) {
-        for (final String prefix : prefixes) {
-            if (hasProperty(prefix + key)) {
-                return getBooleanProperty(prefix + key);
-            }
-        }
-        return supplier != null ? supplier.get() : null;
-    }
-
-    /**
-     * Gets the named property as a Charset value.
-     *
-     * @param name the name of the property to look up
-     * @return the Charset value of the property or {@link Charset#defaultCharset()} if undefined.
-     */
-    public Charset getCharsetProperty(final String name) {
-        return getCharsetProperty(name, Charset.defaultCharset());
-    }
-
-    /**
-     * Gets the named property as a Charset value. If we cannot find the named Charset, see if it is mapped in
-     * file {@code Log4j-charsets.properties} on the class path.
-     *
-     * @param name         the name of the property to look up
-     * @param defaultValue the default value to use if the property is undefined
-     * @return the Charset value of the property or {@code defaultValue} if undefined.
-     */
-    public Charset getCharsetProperty(final String name, final Charset defaultValue) {
-        final String charsetName = getStringProperty(name);
-        if (charsetName == null) {
-            return defaultValue;
-        }
-        if (Charset.isSupported(charsetName)) {
-            return Charset.forName(charsetName);
-        }
-        final ResourceBundle bundle = getCharsetsResourceBundle();
-        if (bundle.containsKey(name)) {
-            final String mapped = bundle.getString(name);
-            if (Charset.isSupported(mapped)) {
-                return Charset.forName(mapped);
-            }
-        }
-        LowLevelLogUtil.log("Unable to get Charset '" + charsetName + "' for property '" + name + "', using default "
-            + defaultValue + " and continuing.");
-        return defaultValue;
+        return environment.hasProperty(name);
     }
 
     /**
@@ -256,153 +162,15 @@ public final class PropertiesUtil {
         return defaultValue;
     }
 
-    /**
-     * Gets the named property as an integer.
-     *
-     * @param name         the name of the property to look up
-     * @param defaultValue the default value to use if the property is undefined
-     * @return the parsed integer value of the property or {@code defaultValue} if it was undefined or could not be
-     * parsed.
-     */
-    public int getIntegerProperty(final String name, final int defaultValue) {
-        final String prop = getStringProperty(name);
-        if (prop != null) {
-            try {
-                return Integer.parseInt(prop);
-            } catch (final Exception ignored) {
-                return defaultValue;
-            }
-        }
-        return defaultValue;
-    }
-
-    /**
-     * Retrieves a property that may be prefixed by more than one string.
-     * @param prefixes The array of prefixes.
-     * @param key The key to locate.
-     * @param supplier The method to call to derive the default value. If the value is null, null will be returned
-     * if no property is found.
-     * @return The value or null if it is not found.
-     * @since 2.13.0
-     */
-    public Integer getIntegerProperty(final String[] prefixes, final String key, final Supplier<Integer> supplier) {
-        for (final String prefix : prefixes) {
-            if (hasProperty(prefix + key)) {
-                return getIntegerProperty(prefix + key, 0);
-            }
-        }
-        return supplier != null ? supplier.get() : null;
-    }
-
-    /**
-     * Gets the named property as a long.
-     *
-     * @param name         the name of the property to look up
-     * @param defaultValue the default value to use if the property is undefined
-     * @return the parsed long value of the property or {@code defaultValue} if it was undefined or could not be parsed.
-     */
-    public long getLongProperty(final String name, final long defaultValue) {
-        final String prop = getStringProperty(name);
-        if (prop != null) {
-            try {
-                return Long.parseLong(prop);
-            } catch (final Exception ignored) {
-                return defaultValue;
-            }
-        }
-        return defaultValue;
-    }
-    /**
-     * Retrieves a property that may be prefixed by more than one string.
-     * @param prefixes The array of prefixes.
-     * @param key The key to locate.
-     * @param supplier The method to call to derive the default value. If the value is null, null will be returned
-     * if no property is found.
-     * @return The value or null if it is not found.
-     * @since 2.13.0
-     */
-    public Long getLongProperty(final String[] prefixes, final String key, final Supplier<Long> supplier) {
-        for (final String prefix : prefixes) {
-            if (hasProperty(prefix + key)) {
-                return getLongProperty(prefix + key, 0);
-            }
-        }
-        return supplier != null ? supplier.get() : null;
-    }
-
-    /**
-     * Retrieves a Duration where the String is of the format nnn[unit] where nnn represents an integer value
-     * and unit represents a time unit.
-     * @param name The property name.
-     * @param defaultValue The default value.
-     * @return The value of the String as a Duration or the default value, which may be null.
-     * @since 2.13.0
-     */
-    public Duration getDurationProperty(final String name, final Duration defaultValue) {
-        final String prop = getStringProperty(name);
-        if (prop != null) {
-            return TimeUnit.getDuration(prop);
-        }
-        return defaultValue;
-    }
-
-    /**
-     * Retrieves a property that may be prefixed by more than one string.
-     * @param prefixes The array of prefixes.
-     * @param key The key to locate.
-     * @param supplier The method to call to derive the default value. If the value is null, null will be returned
-     * if no property is found.
-     * @return The value or null if it is not found.
-     * @since 2.13.0
-     */
-    public Duration getDurationProperty(final String[] prefixes, final String key, final Supplier<Duration> supplier) {
-        for (final String prefix : prefixes) {
-            if (hasProperty(prefix + key)) {
-                return getDurationProperty(prefix + key, null);
-            }
-        }
-        return supplier != null ? supplier.get() : null;
-    }
-
-    /**
-     * Retrieves a property that may be prefixed by more than one string.
-     * @param prefixes The array of prefixes.
-     * @param key The key to locate.
-     * @param supplier The method to call to derive the default value. If the value is null, null will be returned
-     * if no property is found.
-     * @return The value or null if it is not found.
-     * @since 2.13.0
-     */
-    public String getStringProperty(final String[] prefixes, final String key, final Supplier<String> supplier) {
-        for (final String prefix : prefixes) {
-            final String result = getStringProperty(prefix + key);
-            if (result != null) {
-                return result;
-            }
-        }
-        return supplier != null ? supplier.get() : null;
-    }
-
     /**
      * Gets the named property as a String.
      *
      * @param name the name of the property to look up
      * @return the String value of the property or {@code null} if undefined.
      */
+    @Override
     public String getStringProperty(final String name) {
-        return environment.get(name);
-    }
-
-    /**
-     * Gets the named property as a String.
-     *
-     * @param name         the name of the property to look up
-     * @param defaultValue the default value to use if the property is undefined
-     * @return the String value of the property or {@code defaultValue} if undefined.
-     */
-    public String getStringProperty(final String name, final String defaultValue) {
-        final String prop = getStringProperty(name);
-        return (prop == null) ? defaultValue : prop;
+        return environment.getStringProperty(name);
     }
 
     /**
@@ -442,7 +210,7 @@ public final class PropertiesUtil {
      *
      * @since 2.10.0
      */
-    private static class Environment {
+    private static class Environment implements PropertyEnvironment {
 
         private final Set<PropertySource> sources = new ConcurrentSkipListSet<>(new PropertySource.Comparator());
         /**
@@ -473,11 +241,8 @@ public final class PropertiesUtil {
             reload();
         }
 
-        /**
-         * Allow a PropertySource to be added.
-         * @param propertySource The PropertySource to add.
-         */
-        public void addPropertySource(PropertySource propertySource) {
+        @Override
+        public void addPropertySource(final PropertySource propertySource) {
             sources.add(propertySource);
         }
 
@@ -489,7 +254,7 @@ public final class PropertiesUtil {
             final Set<String> keys = new HashSet<>();
             sources.stream()
                    .map(PropertySource::getPropertyNames)
-                   .forEach(sourceKeys -> keys.addAll(sourceKeys));
+                   .forEach(keys::addAll);
             // 2. Fills the property caches. Sources with higher priority values don't override the previous ones.
             keys.stream()
                 .filter(Objects::nonNull)
@@ -514,7 +279,8 @@ public final class PropertiesUtil {
                 });
         }
 
-        private String get(final String key) {
+        @Override
+        public String getStringProperty(final String key) {
             if (normalized.containsKey(key)) {
                 return normalized.get(key);
             }
@@ -537,7 +303,8 @@ public final class PropertiesUtil {
             return tokenized.get(tokens);
         }
 
-        private boolean containsKey(final String key) {
+        @Override
+        public boolean hasProperty(final String key) {
             List<CharSequence> tokens = PropertySource.Util.tokenize(key);
             return normalized.containsKey(key) ||
                    literal.containsKey(key) ||
@@ -629,16 +396,7 @@ public final class PropertiesUtil {
         return parts;
     }
 
-    /**
-     * Returns true if system properties tell us we are running on Windows.
-     *
-     * @return true if system properties tell us we are running on Windows.
-     */
-    public boolean isOsWindows() {
-        return getStringProperty("os.name", "").startsWith("Windows");
-    }
-
-    private enum TimeUnit {
+    enum TimeUnit {
         NANOS("ns,nano,nanos,nanosecond,nanoseconds", ChronoUnit.NANOS),
         MICROS("us,micro,micros,microsecond,microseconds", ChronoUnit.MICROS),
         MILLIS("ms,milli,millis,millsecond,milliseconds", ChronoUnit.MILLIS),
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyEnvironment.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyEnvironment.java
new file mode 100644
index 0000000000..910906fde9
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertyEnvironment.java
@@ -0,0 +1,291 @@
+/*
+ * 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.logging.log4j.util;
+
+import java.nio.charset.Charset;
+import java.time.Duration;
+import java.util.ResourceBundle;
+
+public interface PropertyEnvironment {
+
+    /**
+     * Allows a PropertySource to be added after PropertiesUtil has been created.
+     * @param propertySource the PropertySource to add.
+     */
+    void addPropertySource(PropertySource propertySource);
+
+    /**
+     * Returns {@code true} if the specified property is defined, regardless of its value (it may not have a value).
+     *
+     * @param name the name of the property to verify
+     * @return {@code true} if the specified property is defined, regardless of its value
+     */
+    boolean hasProperty(String name);
+
+    /**
+     * Gets the named property as a boolean value. If the property matches the string {@code "true"} (case-insensitive),
+     * then it is returned as the boolean value {@code true}. Any other non-{@code null} text in the property is
+     * considered {@code false}.
+     *
+     * @param name the name of the property to look up
+     * @return the boolean value of the property or {@code false} if undefined.
+     */
+    default boolean getBooleanProperty(String name) {
+        return getBooleanProperty(name, false);
+    }
+
+    /**
+     * Gets the named property as a boolean value.
+     *
+     * @param name         the name of the property to look up
+     * @param defaultValue the default value to use if the property is undefined
+     * @return the boolean value of the property or {@code defaultValue} if undefined.
+     */
+    default boolean getBooleanProperty(String name, boolean defaultValue) {
+        final String prop = getStringProperty(name);
+        return prop == null ? defaultValue : "true".equalsIgnoreCase(prop);
+    }
+
+    /**
+     * Gets the named property as a boolean value.
+     *
+     * @param name                  the name of the property to look up
+     * @param defaultValueIfAbsent  the default value to use if the property is undefined
+     * @param defaultValueIfPresent the default value to use if the property is defined but not assigned
+     * @return the boolean value of the property or {@code defaultValue} if undefined.
+     */
+    default boolean getBooleanProperty(String name, boolean defaultValueIfAbsent,
+                                       boolean defaultValueIfPresent) {
+        final String prop = getStringProperty(name);
+        return prop == null ? defaultValueIfAbsent
+            : prop.isEmpty() ? defaultValueIfPresent : "true".equalsIgnoreCase(prop);
+    }
+
+    /**
+     * Retrieves a property that may be prefixed by more than one string.
+     * @param prefixes The array of prefixes.
+     * @param key The key to locate.
+     * @param supplier The method to call to derive the default value. If the value is null, null will be returned
+     * if no property is found.
+     * @return The value or null if it is not found.
+     * @since 2.13.0
+     */
+    default Boolean getBooleanProperty(String[] prefixes, String key, Supplier<Boolean> supplier) {
+        for (final String prefix : prefixes) {
+            if (hasProperty(prefix + key)) {
+                return getBooleanProperty(prefix + key);
+            }
+        }
+        return supplier != null ? supplier.get() : null;
+    }
+
+    /**
+     * Gets the named property as a Charset value.
+     *
+     * @param name the name of the property to look up
+     * @return the Charset value of the property or {@link Charset#defaultCharset()} if undefined.
+     */
+    default Charset getCharsetProperty(String name) {
+        return getCharsetProperty(name, Charset.defaultCharset());
+    }
+
+    /**
+     * Gets the named property as a Charset value. If we cannot find the named Charset, see if it is mapped in
+     * file {@code Log4j-charsets.properties} on the class path.
+     *
+     * @param name         the name of the property to look up
+     * @param defaultValue the default value to use if the property is undefined
+     * @return the Charset value of the property or {@code defaultValue} if undefined.
+     */
+    default Charset getCharsetProperty(String name, Charset defaultValue) {
+        final String charsetName = getStringProperty(name);
+        if (charsetName == null) {
+            return defaultValue;
+        }
+        if (Charset.isSupported(charsetName)) {
+            return Charset.forName(charsetName);
+        }
+        final ResourceBundle bundle = PropertiesUtil.getCharsetsResourceBundle();
+        if (bundle.containsKey(name)) {
+            final String mapped = bundle.getString(name);
+            if (Charset.isSupported(mapped)) {
+                return Charset.forName(mapped);
+            }
+        }
+        LowLevelLogUtil.log("Unable to get Charset '" + charsetName + "' for property '" + name + "', using default "
+            + defaultValue + " and continuing.");
+        return defaultValue;
+    }
+
+    /**
+     * Gets the named property as an integer.
+     *
+     * @param name         the name of the property to look up
+     * @param defaultValue the default value to use if the property is undefined
+     * @return the parsed integer value of the property or {@code defaultValue} if it was undefined or could not be
+     * parsed.
+     */
+    default int getIntegerProperty(String name, int defaultValue) {
+        final String prop = getStringProperty(name);
+        if (prop != null) {
+            try {
+                return Integer.parseInt(prop);
+            } catch (final Exception ignored) {
+                return defaultValue;
+            }
+        }
+        return defaultValue;
+    }
+
+    /**
+     * Retrieves a property that may be prefixed by more than one string.
+     * @param prefixes The array of prefixes.
+     * @param key The key to locate.
+     * @param supplier The method to call to derive the default value. If the value is null, null will be returned
+     * if no property is found.
+     * @return The value or null if it is not found.
+     * @since 2.13.0
+     */
+    default Integer getIntegerProperty(String[] prefixes, String key, Supplier<Integer> supplier) {
+        for (final String prefix : prefixes) {
+            if (hasProperty(prefix + key)) {
+                return getIntegerProperty(prefix + key, 0);
+            }
+        }
+        return supplier != null ? supplier.get() : null;
+    }
+
+    /**
+     * Gets the named property as a long.
+     *
+     * @param name         the name of the property to look up
+     * @param defaultValue the default value to use if the property is undefined
+     * @return the parsed long value of the property or {@code defaultValue} if it was undefined or could not be parsed.
+     */
+    default long getLongProperty(String name, long defaultValue) {
+        final String prop = getStringProperty(name);
+        if (prop != null) {
+            try {
+                return Long.parseLong(prop);
+            } catch (final Exception ignored) {
+                return defaultValue;
+            }
+        }
+        return defaultValue;
+    }
+
+    /**
+     * Retrieves a property that may be prefixed by more than one string.
+     * @param prefixes The array of prefixes.
+     * @param key The key to locate.
+     * @param supplier The method to call to derive the default value. If the value is null, null will be returned
+     * if no property is found.
+     * @return The value or null if it is not found.
+     * @since 2.13.0
+     */
+    default Long getLongProperty(String[] prefixes, String key, Supplier<Long> supplier) {
+        for (final String prefix : prefixes) {
+            if (hasProperty(prefix + key)) {
+                return getLongProperty(prefix + key, 0);
+            }
+        }
+        return supplier != null ? supplier.get() : null;
+    }
+
+    /**
+     * Retrieves a Duration where the String is of the format nnn[unit] where nnn represents an integer value
+     * and unit represents a time unit.
+     * @param name The property name.
+     * @param defaultValue The default value.
+     * @return The value of the String as a Duration or the default value, which may be null.
+     * @since 2.13.0
+     */
+    default Duration getDurationProperty(String name, Duration defaultValue) {
+        final String prop = getStringProperty(name);
+        if (prop != null) {
+            return PropertiesUtil.TimeUnit.getDuration(prop);
+        }
+        return defaultValue;
+    }
+
+    /**
+     * Retrieves a property that may be prefixed by more than one string.
+     * @param prefixes The array of prefixes.
+     * @param key The key to locate.
+     * @param supplier The method to call to derive the default value. If the value is null, null will be returned
+     * if no property is found.
+     * @return The value or null if it is not found.
+     * @since 2.13.0
+     */
+    default Duration getDurationProperty(String[] prefixes, String key, Supplier<Duration> supplier) {
+        for (final String prefix : prefixes) {
+            if (hasProperty(prefix + key)) {
+                return getDurationProperty(prefix + key, null);
+            }
+        }
+        return supplier != null ? supplier.get() : null;
+    }
+
+    /**
+     * Retrieves a property that may be prefixed by more than one string.
+     * @param prefixes The array of prefixes.
+     * @param key The key to locate.
+     * @param supplier The method to call to derive the default value. If the value is null, null will be returned
+     * if no property is found.
+     * @return The value or null if it is not found.
+     * @since 2.13.0
+     */
+    default String getStringProperty(String[] prefixes, String key, Supplier<String> supplier) {
+        for (final String prefix : prefixes) {
+            final String result = getStringProperty(prefix + key);
+            if (result != null) {
+                return result;
+            }
+        }
+        return supplier != null ? supplier.get() : null;
+    }
+
+    /**
+     * Gets the named property as a String.
+     *
+     * @param name the name of the property to look up
+     * @return the String value of the property or {@code null} if undefined.
+     */
+    String getStringProperty(String name);
+
+    /**
+     * Gets the named property as a String.
+     *
+     * @param name         the name of the property to look up
+     * @param defaultValue the default value to use if the property is undefined
+     * @return the String value of the property or {@code defaultValue} if undefined.
+     */
+    default String getStringProperty(String name, String defaultValue) {
+        final String prop = getStringProperty(name);
+        return (prop == null) ? defaultValue : prop;
+    }
+
+    /**
+     * Returns true if system properties tell us we are running on Windows.
+     *
+     * @return true if system properties tell us we are running on Windows.
+     */
+    default boolean isOsWindows() {
+        return getStringProperty("os.name", "").startsWith("Windows");
+    }
+}
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
index 62db6cb23b..9589a01a9f 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactoryTest.java
@@ -26,7 +26,7 @@ import org.junit.experimental.categories.Category;
 
 import java.util.Locale;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
 
 /**
  * Tests the AsyncQueueFullPolicyFactory class.
@@ -39,7 +39,7 @@ public class AsyncQueueFullPolicyFactoryTest {
     public void resetProperties() throws Exception {
         System.clearProperty(AsyncQueueFullPolicyFactory.PROPERTY_NAME_ASYNC_EVENT_ROUTER);
         System.clearProperty(AsyncQueueFullPolicyFactory.PROPERTY_NAME_DISCARDING_THRESHOLD_LEVEL);
-        PropertiesUtil.getProperties().reload();
+        ((PropertiesUtil) PropertiesUtil.getProperties()).reload();
     }
 
     @Test
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java
index 767c0e6924..45201b94ce 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/async/AsyncThreadContextTest.java
@@ -94,7 +94,7 @@ public class AsyncThreadContextTest {
             System.clearProperty("log4j2.threadContextMap");
             final String PACKAGE = "org.apache.logging.log4j.spi.";
             System.setProperty("log4j2.threadContextMap", PACKAGE + implClassSimpleName());
-            PropertiesUtil.getProperties().reload();
+            ((PropertiesUtil) PropertiesUtil.getProperties()).reload();
             ThreadContextTestAccess.init();
         }
 
diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java
index 365f876593..bebafb261d 100644
--- a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java
+++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/impl/ThreadContextDataInjectorTest.java
@@ -16,26 +16,10 @@
  */
 package org.apache.logging.log4j.core.impl;
 
-import static java.util.Arrays.asList;
-import static java.util.concurrent.Executors.newSingleThreadExecutor;
-import static org.apache.logging.log4j.ThreadContext.getThreadContextMap;
-import static org.apache.logging.log4j.core.impl.ContextDataInjectorFactory.createInjector;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.allOf;
-import static org.hamcrest.Matchers.empty;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.hasEntry;
-import static org.hamcrest.Matchers.hasKey;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.not;
-
-import java.util.Collection;
-import java.util.concurrent.ExecutionException;
-
 import org.apache.logging.log4j.ThreadContext;
-import org.apache.logging.log4j.test.ThreadContextUtilityClass;
 import org.apache.logging.log4j.core.ContextDataInjector;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
+import org.apache.logging.log4j.test.ThreadContextUtilityClass;
 import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.SortedArrayStringMap;
 import org.apache.logging.log4j.util.StringMap;
@@ -47,6 +31,16 @@ import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
 import org.junit.runners.Parameterized.Parameters;
 
+import java.util.Collection;
+import java.util.concurrent.ExecutionException;
+
+import static java.util.Arrays.asList;
+import static java.util.concurrent.Executors.newSingleThreadExecutor;
+import static org.apache.logging.log4j.ThreadContext.getThreadContextMap;
+import static org.apache.logging.log4j.core.impl.ContextDataInjectorFactory.createInjector;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+
 @RunWith(Parameterized.class)
 public class ThreadContextDataInjectorTest {
     @Parameters(name = "{0}")
@@ -108,7 +102,7 @@ public class ThreadContextDataInjectorTest {
 
     private void prepareThreadContext(boolean isThreadContextMapInheritable) {
         System.setProperty("log4j2.isThreadContextMapInheritable", Boolean.toString(isThreadContextMapInheritable));
-        PropertiesUtil.getProperties().reload();
+        ((PropertiesUtil) PropertiesUtil.getProperties()).reload();
         ThreadContextUtilityClass.reset();
         ThreadContext.remove("baz");
         ThreadContext.put("foo", "bar");
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
index 9346f9c569..08a07418fc 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
@@ -30,6 +30,7 @@ import org.apache.logging.log4j.plugins.PluginFactory;
 import org.apache.logging.log4j.plugins.validation.constraints.Required;
 import org.apache.logging.log4j.util.Chars;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 
 import java.io.FileDescriptor;
 import java.io.FileOutputStream;
@@ -186,8 +187,8 @@ public final class ConsoleAppender extends AbstractOutputStreamAppender<OutputSt
         } catch (final UnsupportedEncodingException ex) { // should never happen
             throw new IllegalStateException("Unsupported default encoding " + enc, ex);
         }
-        final PropertiesUtil propsUtil = PropertiesUtil.getProperties();
-        if (!propsUtil.isOsWindows() || propsUtil.getBooleanProperty("log4j.skipJansi", true) || direct) {
+        final PropertyEnvironment properties = PropertiesUtil.getProperties();
+        if (!properties.isOsWindows() || properties.getBooleanProperty("log4j.skipJansi", true) || direct) {
             return outputStream;
         }
         try {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java
index c9a59e592c..b73f4034b4 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncQueueFullPolicyFactory.java
@@ -21,6 +21,7 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.util.Loader;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 
 /**
  * Creates {@link AsyncQueueFullPolicy} instances based on user-specified system properties. The {@code AsyncQueueFullPolicy}
@@ -99,8 +100,8 @@ public class AsyncQueueFullPolicyFactory {
     }
 
     private static AsyncQueueFullPolicy createDiscardingAsyncQueueFullPolicy() {
-        final PropertiesUtil util = PropertiesUtil.getProperties();
-        final String level = util.getStringProperty(PROPERTY_NAME_DISCARDING_THRESHOLD_LEVEL, Level.INFO.name());
+        final PropertyEnvironment properties = PropertiesUtil.getProperties();
+        final String level = properties.getStringProperty(PROPERTY_NAME_DISCARDING_THRESHOLD_LEVEL, Level.INFO.name());
         final Level thresholdLevel = Level.toLevel(level, Level.INFO);
         LOGGER.debug("Creating custom DiscardingAsyncQueueFullPolicy(discardThreshold:{})", thresholdLevel);
         return new DiscardingAsyncQueueFullPolicy(thresholdLevel);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
index 39a3c2b5ec..d513da1076 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationFactory.java
@@ -29,7 +29,7 @@ import org.apache.logging.log4j.plugins.di.Key;
 import org.apache.logging.log4j.plugins.model.PluginNamespace;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 
 import java.net.URI;
 
@@ -121,7 +121,7 @@ public abstract class ConfigurationFactory extends ConfigurationBuilderFactory {
         return LoggerContext.getContext(false).getInjector().getInstance(KEY);
     }
 
-    public static AuthorizationProvider authorizationProvider(final PropertiesUtil props) {
+    public static AuthorizationProvider authorizationProvider(final PropertyEnvironment props) {
         final String authClass = props.getStringProperty(PREFIXES, "authorizationProvider", null);
         AuthorizationProvider provider = null;
         if (authClass != null) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultConfigurationFactory.java
index 531cfd63e6..774509482a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/DefaultConfigurationFactory.java
@@ -27,6 +27,7 @@ import org.apache.logging.log4j.plugins.di.Injector;
 import org.apache.logging.log4j.util.Lazy;
 import org.apache.logging.log4j.util.LoaderUtil;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.Strings;
 
 import java.net.URI;
@@ -63,7 +64,7 @@ public class DefaultConfigurationFactory extends ConfigurationFactory {
     public Configuration getConfiguration(final LoggerContext loggerContext, final String name, final URI configLocation) {
 
         if (configLocation == null) {
-            final PropertiesUtil properties = PropertiesUtil.getProperties();
+            final PropertyEnvironment properties = PropertiesUtil.getProperties();
             final String configLocationStr = substitutor.replace(properties.getStringProperty(CONFIGURATION_FILE_PROPERTY));
             if (configLocationStr != null) {
                 final String[] sources = parseConfigLocations(configLocationStr);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultBundle.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultBundle.java
index 32e2893dbd..3b03b75db1 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultBundle.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/DefaultBundle.java
@@ -57,6 +57,7 @@ import org.apache.logging.log4j.spi.DefaultThreadContextMap;
 import org.apache.logging.log4j.spi.ReadOnlyThreadContextMap;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 
 import java.util.Map;
 import java.util.function.Supplier;
@@ -82,10 +83,10 @@ public class DefaultBundle {
     private static final Logger LOGGER = StatusLogger.getLogger();
 
     private final Injector injector;
-    private final PropertiesUtil properties;
+    private final PropertyEnvironment properties;
     private final ClassLoader classLoader;
 
-    public DefaultBundle(final Injector injector, final PropertiesUtil properties, final ClassLoader classLoader) {
+    public DefaultBundle(final Injector injector, final PropertyEnvironment properties, final ClassLoader classLoader) {
         this.injector = injector;
         this.properties = properties;
         this.classLoader = classLoader;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
index 12fe627430..dfa94b0ce3 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java
@@ -32,6 +32,7 @@ import org.apache.logging.log4j.plugins.PluginBuilderAttribute;
 import org.apache.logging.log4j.plugins.PluginElement;
 import org.apache.logging.log4j.plugins.PluginFactory;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 import org.apache.logging.log4j.util.Strings;
 
 import java.nio.charset.Charset;
@@ -573,9 +574,9 @@ public final class PatternLayout extends AbstractStringLayout {
         }
 
         private boolean useAnsiEscapeCodes() {
-            final PropertiesUtil propertiesUtil = PropertiesUtil.getProperties();
-            final boolean isPlatformSupportsAnsi = !propertiesUtil.isOsWindows();
-            final boolean isJansiRequested = !propertiesUtil.getBooleanProperty("log4j.skipJansi", true);
+            final PropertyEnvironment properties = PropertiesUtil.getProperties();
+            final boolean isPlatformSupportsAnsi = !properties.isOsWindows();
+            final boolean isJansiRequested = !properties.getBooleanProperty("log4j.skipJansi", true);
             return isPlatformSupportsAnsi || isJansiRequested;
         }
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java
index cd9cb99e54..d60753a920 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/UrlConnectionFactory.java
@@ -16,6 +16,16 @@
  */
 package org.apache.logging.log4j.core.net;
 
+import org.apache.logging.log4j.core.config.ConfigurationFactory;
+import org.apache.logging.log4j.core.net.ssl.LaxHostnameVerifier;
+import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
+import org.apache.logging.log4j.core.net.ssl.SslConfigurationFactory;
+import org.apache.logging.log4j.core.util.AuthorizationProvider;
+import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
+import org.apache.logging.log4j.util.Strings;
+
+import javax.net.ssl.HttpsURLConnection;
 import java.io.IOException;
 import java.net.HttpURLConnection;
 import java.net.JarURLConnection;
@@ -25,15 +35,6 @@ import java.net.URLConnection;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
-import javax.net.ssl.HttpsURLConnection;
-
-import org.apache.logging.log4j.core.config.ConfigurationFactory;
-import org.apache.logging.log4j.core.net.ssl.LaxHostnameVerifier;
-import org.apache.logging.log4j.core.net.ssl.SslConfiguration;
-import org.apache.logging.log4j.core.net.ssl.SslConfigurationFactory;
-import org.apache.logging.log4j.core.util.AuthorizationProvider;
-import org.apache.logging.log4j.util.PropertiesUtil;
-import org.apache.logging.log4j.util.Strings;
 
 /**
  * Constructs an HTTPURLConnection. This class should be considered to be internal
@@ -58,7 +59,7 @@ public class UrlConnectionFactory {
     public static <T extends URLConnection> T createConnection(final URL url, final long lastModifiedMillis,
             final SslConfiguration sslConfiguration, final AuthorizationProvider authorizationProvider)
         throws IOException {
-        final PropertiesUtil props = PropertiesUtil.getProperties();
+        final PropertyEnvironment props = PropertiesUtil.getProperties();
         final List<String> allowed = Arrays.asList(Strings.splitList(props
                 .getStringProperty(ALLOWED_PROTOCOLS, DEFAULT_ALLOWED_PROTOCOLS).toLowerCase(Locale.ROOT)));
         if (allowed.size() == 1 && NO_PROTOCOLS.equals(allowed.get(0))) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactory.java
index 549d2cfc81..6fdbbbc8a7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/net/ssl/SslConfigurationFactory.java
@@ -20,6 +20,7 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.Lazy;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 
 /**
  * Creates an SSL configuration from Log4j properties.
@@ -43,11 +44,11 @@ public class SslConfigurationFactory {
     private static final String verifyHostName = "log4j2.ssl.verifyHostName";
 
     private static final Lazy<SslConfiguration> SSL_CONFIGURATION = Lazy.lazy(() -> {
-        final PropertiesUtil props = PropertiesUtil.getProperties();
+        final PropertyEnvironment props = PropertiesUtil.getProperties();
         return createSslConfiguration(props);
     });
 
-    static final SslConfiguration createSslConfiguration(final PropertiesUtil props) {
+    static final SslConfiguration createSslConfiguration(final PropertyEnvironment props) {
         KeyStoreConfiguration keyStoreConfiguration = null;
         TrustStoreConfiguration trustStoreConfiguration = null;
         String location = props.getStringProperty(trustStorelocation);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BasicAuthorizationProvider.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BasicAuthorizationProvider.java
index 61aa2d5721..793fbc2b87 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BasicAuthorizationProvider.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/BasicAuthorizationProvider.java
@@ -16,13 +16,13 @@
  */
 package org.apache.logging.log4j.core.util;
 
-import java.net.URLConnection;
-import java.util.Base64;
-
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.LoaderUtil;
-import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
+
+import java.net.URLConnection;
+import java.util.Base64;
 
 /**
  * Provides the Basic Authorization header to a request.
@@ -41,7 +41,7 @@ public class BasicAuthorizationProvider implements AuthorizationProvider {
 
     private String authString = null;
 
-    public BasicAuthorizationProvider(final PropertiesUtil props) {
+    public BasicAuthorizationProvider(final PropertyEnvironment props) {
         final String userName = props.getStringProperty(PREFIXES,AUTH_USER_NAME,
                 () -> props.getStringProperty(CONFIG_USER_NAME));
         String password = props.getStringProperty(PREFIXES, AUTH_PASSWORD,
diff --git a/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java b/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
index 592e3372d4..385100d519 100644
--- a/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
+++ b/log4j-docker/src/main/java/org/apache/logging/log4j/docker/DockerLookup.java
@@ -28,6 +28,7 @@ import org.apache.logging.log4j.docker.model.Network;
 import org.apache.logging.log4j.plugins.Plugin;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 
 import java.io.IOException;
 import java.net.URL;
@@ -52,7 +53,7 @@ public class DockerLookup extends AbstractLookup {
     public DockerLookup() {
         String baseUri = System.getenv(DOCKER_URI);
         if (baseUri == null) {
-            final PropertiesUtil props = PropertiesUtil.getProperties();
+            final PropertyEnvironment props = PropertiesUtil.getProperties();
             baseUri = props.getStringProperty(DOCKER_URI);
         }
         if (baseUri == null) {
diff --git a/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/AbstractJpaAppenderTest.java b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/AbstractJpaAppenderTest.java
index 7e52c050c9..49112475bc 100644
--- a/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/AbstractJpaAppenderTest.java
+++ b/log4j-jpa/src/test/java/org/apache/logging/log4j/jpa/appender/AbstractJpaAppenderTest.java
@@ -16,25 +16,25 @@
  */
 package org.apache.logging.log4j.jpa.appender;
 
-import java.io.ByteArrayOutputStream;
-import java.io.PrintWriter;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.test.categories.Appenders;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.ConfigurationFactory;
 import org.apache.logging.log4j.core.config.DefaultConfiguration;
+import org.apache.logging.log4j.core.test.categories.Appenders;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.PropertiesUtil;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
 import static org.junit.Assert.*;
 
 @Category(Appenders.Jpa.class)
@@ -55,7 +55,7 @@ public abstract class AbstractJpaAppenderTest {
         assertNotNull(getClass().getClassLoader().getResource(resource));
         System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY,
                 resource);
-        PropertiesUtil.getProperties().reload();
+        ((PropertiesUtil) PropertiesUtil.getProperties()).reload();
         final LoggerContext context = LoggerContext.getContext(false);
         if (context.getConfiguration() instanceof DefaultConfiguration) {
             context.reconfigure();
@@ -73,7 +73,7 @@ public abstract class AbstractJpaAppenderTest {
             ((JpaAppender) appender).getManager().close();
         } finally {
             System.clearProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY);
-            PropertiesUtil.getProperties().reload();
+            ((PropertiesUtil) PropertiesUtil.getProperties()).reload();
             context.reconfigure();
             StatusLogger.getLogger().reset();
 
diff --git a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
index bcfdeead7b..e75066ae96 100644
--- a/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
+++ b/log4j-layout-template-json/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutDefaults.java
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.layout.template.json;
 import org.apache.logging.log4j.layout.template.json.util.RecyclerFactories;
 import org.apache.logging.log4j.layout.template.json.util.RecyclerFactory;
 import org.apache.logging.log4j.util.PropertiesUtil;
+import org.apache.logging.log4j.util.PropertyEnvironment;
 
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
@@ -29,7 +30,7 @@ public final class JsonTemplateLayoutDefaults {
 
     private JsonTemplateLayoutDefaults() {}
 
-    private static final PropertiesUtil PROPERTIES = PropertiesUtil.getProperties();
+    private static final PropertyEnvironment PROPERTIES = PropertiesUtil.getProperties();
 
     public static Charset getCharset() {
         final String charsetName =
diff --git a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/condition/OnPropertyConditionTest.java b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/condition/OnPropertyConditionTest.java
index 2c9c0caf39..1c3d010575 100644
--- a/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/condition/OnPropertyConditionTest.java
+++ b/log4j-plugins-test/src/test/java/org/apache/logging/log4j/plugins/condition/OnPropertyConditionTest.java
@@ -55,7 +55,7 @@ class OnPropertyConditionTest {
     @Test
     @ClearSystemProperty(key = "foo.bar")
     void whenPropertyAbsent() {
-        PropertiesUtil.getProperties().reload();
+        ((PropertiesUtil) PropertiesUtil.getProperties()).reload();
         final String value = DI.createInjector(OnProperty.class).getInstance(String.class);
         assertEquals("goodbye", value);
     }
@@ -63,7 +63,7 @@ class OnPropertyConditionTest {
     @Test
     @SetSystemProperty(key = "foo.bar", value = "whatever")
     void whenPropertyPresent() {
-        PropertiesUtil.getProperties().reload();
+        ((PropertiesUtil) PropertiesUtil.getProperties()).reload();
         final String value = DI.createInjector(OnProperty.class).getInstance(String.class);
         assertEquals("hello", value);
     }
@@ -71,7 +71,7 @@ class OnPropertyConditionTest {
     @Test
     @SetSystemProperty(key = "foo.bar", value = "true")
     void whenPropertyMatches() {
-        PropertiesUtil.getProperties().reload();
+        ((PropertiesUtil) PropertiesUtil.getProperties()).reload();
         final String value = DI.createInjector(OnProperty.class).getInstance(String.class);
         assertEquals("truth", value);
     }