diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidator.java
index 1d9c2d6245..5b3637076a 100644
--- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidator.java
+++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidator.java
@@ -12,6 +12,8 @@
  */
 package org.openhab.core.config.core.internal.validation;
 
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.core.config.core.ConfigDescriptionParameter;
 import org.openhab.core.config.core.validation.ConfigValidationMessage;
 
@@ -21,6 +23,7 @@ import org.openhab.core.config.core.validation.ConfigValidationMessage;
  *
  * @author Thomas Höfer - Initial contribution
  */
+@NonNullByDefault
 public interface ConfigDescriptionParameterValidator {
 
     /**
@@ -32,5 +35,6 @@ public interface ConfigDescriptionParameterValidator {
      * @return a {@link ConfigValidationMessage} if value does not meet the declaration of the parameter,
      *         otherwise null
      */
-    ConfigValidationMessage validate(ConfigDescriptionParameter parameter, Object value);
+    @Nullable
+    ConfigValidationMessage validate(ConfigDescriptionParameter parameter, @Nullable Object value);
 }
diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidatorFactory.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidatorFactory.java
index b725be4cfc..bd2e7e2e43 100644
--- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidatorFactory.java
+++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionParameterValidatorFactory.java
@@ -12,12 +12,15 @@
  */
 package org.openhab.core.config.core.internal.validation;
 
+import org.eclipse.jdt.annotation.NonNullByDefault;
+
 /**
  * The {@link ConfigDescriptionParameterValidatorFactory} creates the corresponding
  * {@link ConfigDescriptionParameterValidator}s used by ConfigDescriptionValidator.
  *
  * @author Thomas Höfer - Initial contribution
  */
+@NonNullByDefault
 public final class ConfigDescriptionParameterValidatorFactory {
 
     private ConfigDescriptionParameterValidatorFactory() {
diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorImpl.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorImpl.java
index f3748e07d5..39ddeb08c9 100644
--- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorImpl.java
+++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorImpl.java
@@ -14,13 +14,13 @@ package org.openhab.core.config.core.internal.validation;
 
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.core.config.core.ConfigDescription;
 import org.openhab.core.config.core.ConfigDescriptionParameter;
 import org.openhab.core.config.core.ConfigDescriptionRegistry;
@@ -32,10 +32,7 @@ import org.openhab.core.i18n.TranslationProvider;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
-import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
-import org.osgi.service.component.annotations.ReferenceCardinality;
-import org.osgi.service.component.annotations.ReferencePolicy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,29 +46,29 @@ import org.slf4j.LoggerFactory;
  * @author Chris Jackson - Handle checks on multiple selection parameters
  */
 @Component
+@NonNullByDefault
 public final class ConfigDescriptionValidatorImpl implements ConfigDescriptionValidator {
 
+    private static final List<ConfigDescriptionParameterValidator> VALIDATORS = List.of( //
+            ConfigDescriptionParameterValidatorFactory.createRequiredValidator(), //
+            ConfigDescriptionParameterValidatorFactory.createTypeValidator(), //
+            ConfigDescriptionParameterValidatorFactory.createMinMaxValidator(), //
+            ConfigDescriptionParameterValidatorFactory.createPatternValidator() //
+    );
+
     private final Logger logger = LoggerFactory.getLogger(ConfigDescriptionValidatorImpl.class);
 
-    private ConfigDescriptionRegistry configDescriptionRegistry;
-    private TranslationProvider translationProvider;
-
-    private static final List<ConfigDescriptionParameterValidator> VALIDATORS = Collections
-            .unmodifiableList(Arrays.asList(ConfigDescriptionParameterValidatorFactory.createRequiredValidator(),
-                    ConfigDescriptionParameterValidatorFactory.createTypeValidator(),
-                    ConfigDescriptionParameterValidatorFactory.createMinMaxValidator(),
-                    ConfigDescriptionParameterValidatorFactory.createPatternValidator()));
-
-    private BundleContext bundleContext;
+    private final ConfigDescriptionRegistry configDescriptionRegistry;
+    private final TranslationProvider translationProvider;
+    private final BundleContext bundleContext;
 
     @Activate
-    protected void activate(BundleContext bundleContext) {
+    public ConfigDescriptionValidatorImpl(final BundleContext bundleContext,
+            final @Reference ConfigDescriptionRegistry configDescriptionRegistry,
+            final @Reference TranslationProvider translationProvider) {
         this.bundleContext = bundleContext;
-    }
-
-    @Deactivate
-    protected void deactivate() {
-        this.bundleContext = null;
+        this.configDescriptionRegistry = configDescriptionRegistry;
+        this.translationProvider = translationProvider;
     }
 
     /**
@@ -86,7 +83,7 @@ public final class ConfigDescriptionValidatorImpl implements ConfigDescriptionVa
      * @throws NullPointerException if given config description URI or configuration parameters are null
      */
     @Override
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings({ "unchecked", "null" })
     public void validate(Map<String, Object> configurationParameters, URI configDescriptionURI) {
         Objects.requireNonNull(configurationParameters, "Configuration parameters must not be null");
         Objects.requireNonNull(configDescriptionURI, "Config description URI must not be null");
@@ -150,8 +147,8 @@ public final class ConfigDescriptionValidatorImpl implements ConfigDescriptionVa
      * @return the {@link ConfigValidationMessage} if the given value is not valid for the config description parameter,
      *         otherwise null
      */
-    private ConfigValidationMessage validateParameter(ConfigDescriptionParameter configDescriptionParameter,
-            Object value) {
+    private @Nullable ConfigValidationMessage validateParameter(ConfigDescriptionParameter configDescriptionParameter,
+            @Nullable Object value) {
         for (ConfigDescriptionParameterValidator validator : VALIDATORS) {
             ConfigValidationMessage message = validator.validate(configDescriptionParameter, value);
             if (message != null) {
@@ -170,33 +167,11 @@ public final class ConfigDescriptionValidatorImpl implements ConfigDescriptionVa
      *         config description registry is not available or because of config description could not be found for
      *         given URI)
      */
-    private ConfigDescription getConfigDescription(URI configDescriptionURI) {
-        if (configDescriptionRegistry == null) {
-            logger.warn("No config description registry available.");
-            return null;
-        }
+    private @Nullable ConfigDescription getConfigDescription(URI configDescriptionURI) {
         ConfigDescription configDescription = configDescriptionRegistry.getConfigDescription(configDescriptionURI);
         if (configDescription == null) {
             logger.warn("No config description found for URI '{}'", configDescriptionURI);
         }
         return configDescription;
     }
-
-    @Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC)
-    protected void setConfigDescriptionRegistry(ConfigDescriptionRegistry configDescriptionRegistry) {
-        this.configDescriptionRegistry = configDescriptionRegistry;
-    }
-
-    protected void unsetConfigDescriptionRegistry(ConfigDescriptionRegistry configDescriptionRegistry) {
-        this.configDescriptionRegistry = null;
-    }
-
-    @Reference(cardinality = ReferenceCardinality.OPTIONAL, policy = ReferencePolicy.DYNAMIC)
-    protected void setTranslationProvider(TranslationProvider translationProvider) {
-        this.translationProvider = translationProvider;
-    }
-
-    protected void unsetTranslationProvider(TranslationProvider translationProvider) {
-        this.translationProvider = null;
-    }
 }
diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MessageKey.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MessageKey.java
index e2c4484f92..d75b99e2fe 100644
--- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MessageKey.java
+++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MessageKey.java
@@ -12,15 +12,18 @@
  */
 package org.openhab.core.config.core.internal.validation;
 
+import org.eclipse.jdt.annotation.NonNullByDefault;
+
 /**
  * Utility class providing the {@link MessageKey}s for config description validation. The {@link MessageKey}
  * consists of a key to be used for internationalization and a general default text.
  *
  * @author Thomas Höfer - Initial contribution
  */
+@NonNullByDefault
 final class MessageKey {
 
-    static final MessageKey PARAMETER_REQUIRED = new MessageKey("parameter_required", "The parameter is required");
+    static final MessageKey PARAMETER_REQUIRED = new MessageKey("parameter_required", "The parameter is required.");
 
     static final MessageKey DATA_TYPE_VIOLATED = new MessageKey("data_type_violated",
             "The data type of the value ({0}) does not match with the type declaration ({1}) in the configuration description.");
diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MinMaxValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MinMaxValidator.java
index 2345498de8..68e1a06452 100644
--- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MinMaxValidator.java
+++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/MinMaxValidator.java
@@ -14,6 +14,8 @@ package org.openhab.core.config.core.internal.validation;
 
 import java.math.BigDecimal;
 
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.core.config.core.ConfigDescriptionParameter;
 import org.openhab.core.config.core.ConfigDescriptionParameter.Type;
 import org.openhab.core.config.core.ParameterOption;
@@ -26,12 +28,12 @@ import org.openhab.core.config.core.validation.ConfigValidationMessage;
  *
  * @author Thomas Höfer - Initial contribution
  * @authod Chris Jackson - Allow options to be outside of min/max value
- * @param <T>
  */
+@NonNullByDefault
 final class MinMaxValidator implements ConfigDescriptionParameterValidator {
 
     @Override
-    public ConfigValidationMessage validate(ConfigDescriptionParameter parameter, Object value) {
+    public @Nullable ConfigValidationMessage validate(ConfigDescriptionParameter parameter, @Nullable Object value) {
         if (value == null || parameter.getType() == Type.BOOLEAN) {
             return null;
         }
@@ -61,7 +63,6 @@ final class MinMaxValidator implements ConfigDescriptionParameterValidator {
                         max);
             }
         }
-
         return null;
     }
 
diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/PatternValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/PatternValidator.java
index 8487efb521..3fa51a123d 100644
--- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/PatternValidator.java
+++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/PatternValidator.java
@@ -12,6 +12,8 @@
  */
 package org.openhab.core.config.core.internal.validation;
 
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.core.config.core.ConfigDescriptionParameter;
 import org.openhab.core.config.core.ConfigDescriptionParameter.Type;
 import org.openhab.core.config.core.validation.ConfigValidationMessage;
@@ -22,10 +24,11 @@ import org.openhab.core.config.core.validation.ConfigValidationMessage;
  *
  * @author Thomas Höfer - Initial contribution
  */
+@NonNullByDefault
 final class PatternValidator implements ConfigDescriptionParameterValidator {
 
     @Override
-    public ConfigValidationMessage validate(ConfigDescriptionParameter parameter, Object value) {
+    public @Nullable ConfigValidationMessage validate(ConfigDescriptionParameter parameter, @Nullable Object value) {
         if (value == null || parameter.getType() != Type.TEXT || parameter.getPattern() == null) {
             return null;
         }
@@ -35,7 +38,6 @@ final class PatternValidator implements ConfigDescriptionParameterValidator {
             return new ConfigValidationMessage(parameter.getName(), messageKey.defaultMessage, messageKey.key,
                     String.valueOf(value), parameter.getPattern());
         }
-
         return null;
     }
 }
diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/RequiredValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/RequiredValidator.java
index 380829316a..8bb239dcc7 100644
--- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/RequiredValidator.java
+++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/RequiredValidator.java
@@ -12,6 +12,8 @@
  */
 package org.openhab.core.config.core.internal.validation;
 
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.core.config.core.ConfigDescriptionParameter;
 import org.openhab.core.config.core.validation.ConfigValidationMessage;
 
@@ -20,15 +22,15 @@ import org.openhab.core.config.core.validation.ConfigValidationMessage;
  *
  * @author Thomas Höfer - Initial contribution
  */
+@NonNullByDefault
 final class RequiredValidator implements ConfigDescriptionParameterValidator {
 
     @Override
-    public ConfigValidationMessage validate(ConfigDescriptionParameter param, Object value) {
+    public @Nullable ConfigValidationMessage validate(ConfigDescriptionParameter param, @Nullable Object value) {
         if (param.isRequired() && value == null) {
             MessageKey messageKey = MessageKey.PARAMETER_REQUIRED;
             return new ConfigValidationMessage(param.getName(), messageKey.defaultMessage, messageKey.key);
         }
-
         return null;
     }
 }
diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeIntrospections.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeIntrospections.java
index 3518b56212..fa2f701b15 100644
--- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeIntrospections.java
+++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeIntrospections.java
@@ -12,8 +12,6 @@
  */
 package org.openhab.core.config.core.internal.validation;
 
-import static java.util.Map.entry;
-
 import java.math.BigDecimal;
 import java.util.Map;
 
@@ -27,9 +25,12 @@ import org.openhab.core.config.core.ConfigDescriptionParameter.Type;
  */
 final class TypeIntrospections {
 
-    private static final Map<Type, TypeIntrospection> INTROSPECTIONS = Map.ofEntries(
-            entry(Type.BOOLEAN, new BooleanIntrospection()), entry(Type.TEXT, new StringIntrospection()),
-            entry(Type.INTEGER, new IntegerIntrospection()), entry(Type.DECIMAL, new FloatIntrospection()));
+    private static final Map<Type, TypeIntrospection> INTROSPECTIONS = Map.of( //
+            Type.BOOLEAN, new BooleanIntrospection(), //
+            Type.TEXT, new StringIntrospection(), //
+            Type.INTEGER, new IntegerIntrospection(), //
+            Type.DECIMAL, new FloatIntrospection() //
+    );
 
     private TypeIntrospections() {
         super();
diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeValidator.java
index fae3f56371..e88027e679 100644
--- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeValidator.java
+++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/internal/validation/TypeValidator.java
@@ -12,8 +12,9 @@
  */
 package org.openhab.core.config.core.internal.validation;
 
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.core.config.core.ConfigDescriptionParameter;
-import org.openhab.core.config.core.ConfigDescriptionParameter.Type;
 import org.openhab.core.config.core.internal.validation.TypeIntrospections.TypeIntrospection;
 import org.openhab.core.config.core.validation.ConfigValidationMessage;
 
@@ -23,25 +24,21 @@ import org.openhab.core.config.core.validation.ConfigValidationMessage;
  *
  * @author Thomas Höfer - Initial contribution
  */
+@NonNullByDefault
 final class TypeValidator implements ConfigDescriptionParameterValidator {
 
     @Override
-    public ConfigValidationMessage validate(ConfigDescriptionParameter parameter, Object value) {
+    public @Nullable ConfigValidationMessage validate(ConfigDescriptionParameter parameter, @Nullable Object value) {
         if (value == null) {
             return null;
         }
 
         TypeIntrospection typeIntrospection = TypeIntrospections.get(parameter.getType());
         if (!typeIntrospection.isAssignable(value)) {
-            return createDataTypeViolationMessage(parameter.getName(), parameter.getType(), value.getClass());
+            return new ConfigValidationMessage(parameter.getName(), MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
+                    MessageKey.DATA_TYPE_VIOLATED.key, value.getClass(), parameter.getType());
         }
 
         return null;
     }
-
-    private static ConfigValidationMessage createDataTypeViolationMessage(String parameterName, Type type,
-            Class<?> clazz) {
-        return new ConfigValidationMessage(parameterName, MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
-                MessageKey.DATA_TYPE_VIOLATED.key, clazz, type);
-    }
 }
diff --git a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/validation/ConfigDescriptionValidator.java b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/validation/ConfigDescriptionValidator.java
index 3cb4c47c5c..b564ac66e4 100644
--- a/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/validation/ConfigDescriptionValidator.java
+++ b/bundles/org.openhab.core.config.core/src/main/java/org/openhab/core/config/core/validation/ConfigDescriptionValidator.java
@@ -15,6 +15,7 @@ package org.openhab.core.config.core.validation;
 import java.net.URI;
 import java.util.Map;
 
+import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.openhab.core.config.core.ConfigDescription;
 import org.openhab.core.config.core.Configuration;
 
@@ -27,6 +28,7 @@ import org.openhab.core.config.core.Configuration;
  * @author Thomas Höfer - Initial contribution
  * @author Chris Jackson - Handle checks on multiple selection parameters
  */
+@NonNullByDefault
 public interface ConfigDescriptionValidator {
 
     /**
diff --git a/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorTest.java b/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorTest.java
index ff2fcfcb9e..b1d4f96fa6 100644
--- a/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorTest.java
+++ b/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigDescriptionValidatorTest.java
@@ -12,10 +12,8 @@
  */
 package org.openhab.core.config.core.internal.validation;
 
-import static java.util.stream.Collectors.toList;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.*;
 
@@ -26,7 +24,6 @@ import java.net.URISyntaxException;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Stream;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -41,10 +38,9 @@ import org.openhab.core.config.core.ConfigDescriptionRegistry;
 import org.openhab.core.config.core.validation.ConfigDescriptionValidator;
 import org.openhab.core.config.core.validation.ConfigValidationException;
 import org.openhab.core.config.core.validation.ConfigValidationMessage;
+import org.openhab.core.i18n.TranslationProvider;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Testing the {@link ConfigDescriptionValidator}.
@@ -54,8 +50,6 @@ import org.slf4j.LoggerFactory;
  */
 public class ConfigDescriptionValidatorTest {
 
-    private final Logger logger = LoggerFactory.getLogger(ConfigDescriptionValidatorTest.class);
-
     private static final int MIN_VIOLATED = 1;
     private static final int MAX_VIOLATED = 1234;
 
@@ -144,10 +138,10 @@ public class ConfigDescriptionValidatorTest {
     }
 
     private static final ConfigDescription CONFIG_DESCRIPTION = ConfigDescriptionBuilder.create(CONFIG_DESCRIPTION_URI)
-            .withParameters(Stream.of(BOOL_PARAM, BOOL_REQUIRED_PARAM, TXT_PARAM, TXT_REQUIRED_PARAM, TXT_MIN_PARAM,
+            .withParameters(List.of(BOOL_PARAM, BOOL_REQUIRED_PARAM, TXT_PARAM, TXT_REQUIRED_PARAM, TXT_MIN_PARAM,
                     TXT_MAX_PARAM, TXT_PATTERN_PARAM, TXT_MAX_PATTERN_PARAM, TXT_MULTIPLE_LIMIT_PARAM, INT_PARAM,
                     INT_REQUIRED_PARAM, INT_MIN_PARAM, INT_MAX_PARAM, DECIMAL_PARAM, DECIMAL_REQUIRED_PARAM,
-                    DECIMAL_MIN_PARAM, DECIMAL_MAX_PARAM).collect(toList()))
+                    DECIMAL_MIN_PARAM, DECIMAL_MAX_PARAM))
             .build();
 
     private Map<String, Object> params;
@@ -165,9 +159,8 @@ public class ConfigDescriptionValidatorTest {
         BundleContext bundleContext = mock(BundleContext.class);
         when(bundleContext.getBundle()).thenReturn(mock(Bundle.class));
 
-        configDescriptionValidator = new ConfigDescriptionValidatorImpl();
-        configDescriptionValidator.setConfigDescriptionRegistry(configDescriptionRegistry);
-        configDescriptionValidator.activate(bundleContext);
+        configDescriptionValidator = new ConfigDescriptionValidatorImpl(bundleContext, configDescriptionRegistry,
+                mock(TranslationProvider.class));
 
         params = new LinkedHashMap<>();
         params.put(BOOL_PARAM_NAME, null);
@@ -232,7 +225,7 @@ public class ConfigDescriptionValidatorTest {
 
     @Test
     public void assertValidationThrowsExceptionContainingMessagesForAllRequiredConfigParameters() {
-        List<ConfigValidationMessage> expected = Stream.of(
+        List<ConfigValidationMessage> expected = List.of(
                 new ConfigValidationMessage(BOOL_REQUIRED_PARAM_NAME, MessageKey.PARAMETER_REQUIRED.defaultMessage,
                         MessageKey.PARAMETER_REQUIRED.key),
                 new ConfigValidationMessage(DECIMAL_REQUIRED_PARAM_NAME, MessageKey.PARAMETER_REQUIRED.defaultMessage,
@@ -240,8 +233,7 @@ public class ConfigDescriptionValidatorTest {
                 new ConfigValidationMessage(TXT_REQUIRED_PARAM_NAME, MessageKey.PARAMETER_REQUIRED.defaultMessage,
                         MessageKey.PARAMETER_REQUIRED.key),
                 new ConfigValidationMessage(INT_REQUIRED_PARAM_NAME, MessageKey.PARAMETER_REQUIRED.defaultMessage,
-                        MessageKey.PARAMETER_REQUIRED.key))
-                .collect(toList());
+                        MessageKey.PARAMETER_REQUIRED.key));
         params.put(BOOL_PARAM_NAME, null);
         params.put(TXT_PARAM_NAME, null);
         params.put(INT_PARAM_NAME, null);
@@ -313,7 +305,7 @@ public class ConfigDescriptionValidatorTest {
 
     @Test
     public void assertValidationThrowsExceptionContainingMessagesForAllMinMaxConfigParameters() {
-        List<ConfigValidationMessage> expected = Stream.of(
+        List<ConfigValidationMessage> expected = List.of(
                 new ConfigValidationMessage(TXT_MAX_PARAM_NAME, MessageKey.MAX_VALUE_TXT_VIOLATED.defaultMessage,
                         MessageKey.MAX_VALUE_TXT_VIOLATED.key, MAX.toString()),
                 new ConfigValidationMessage(INT_MIN_PARAM_NAME, MessageKey.MIN_VALUE_NUMERIC_VIOLATED.defaultMessage,
@@ -327,8 +319,7 @@ public class ConfigDescriptionValidatorTest {
                         MessageKey.MAX_VALUE_NUMERIC_VIOLATED.key, MAX.toString()),
                 new ConfigValidationMessage(DECIMAL_MAX_PARAM_NAME,
                         MessageKey.MAX_VALUE_NUMERIC_VIOLATED.defaultMessage, MessageKey.MAX_VALUE_NUMERIC_VIOLATED.key,
-                        DECIMAL_MAX.toString()))
-                .collect(toList());
+                        DECIMAL_MAX.toString()));
         params.put(TXT_MIN_PARAM_NAME, String.valueOf(MIN_VIOLATED));
         params.put(TXT_MAX_PARAM_NAME, String.valueOf(MAX_VIOLATED));
         params.put(INT_MIN_PARAM_NAME, MIN_VIOLATED);
@@ -375,7 +366,7 @@ public class ConfigDescriptionValidatorTest {
 
     @Test
     public void assertValidationThrowsExceptionContainingMessagesForMultipleInvalidTypedConfigParameters() {
-        List<ConfigValidationMessage> expected = Stream.of(
+        List<ConfigValidationMessage> expected = List.of(
                 new ConfigValidationMessage(BOOL_PARAM_NAME, MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
                         MessageKey.DATA_TYPE_VIOLATED.key, Long.class, Type.BOOLEAN),
                 new ConfigValidationMessage(INT_PARAM_NAME, MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
@@ -383,8 +374,7 @@ public class ConfigDescriptionValidatorTest {
                 new ConfigValidationMessage(TXT_PARAM_NAME, MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
                         MessageKey.DATA_TYPE_VIOLATED.key, Long.class, Type.TEXT),
                 new ConfigValidationMessage(DECIMAL_PARAM_NAME, MessageKey.DATA_TYPE_VIOLATED.defaultMessage,
-                        MessageKey.DATA_TYPE_VIOLATED.key, Long.class, Type.DECIMAL))
-                .collect(toList());
+                        MessageKey.DATA_TYPE_VIOLATED.key, Long.class, Type.DECIMAL));
         params.put(BOOL_PARAM_NAME, INVALID);
         params.put(TXT_PARAM_NAME, INVALID);
         params.put(INT_PARAM_NAME, INVALID);
@@ -434,7 +424,7 @@ public class ConfigDescriptionValidatorTest {
 
     @Test
     public void assertValidationThrowsExceptionContainingMultipleVariousViolations() {
-        List<ConfigValidationMessage> expected = Stream.of(
+        List<ConfigValidationMessage> expected = List.of(
                 new ConfigValidationMessage(BOOL_REQUIRED_PARAM_NAME, MessageKey.PARAMETER_REQUIRED.defaultMessage,
                         MessageKey.PARAMETER_REQUIRED.key),
                 new ConfigValidationMessage(TXT_MAX_PARAM_NAME, MessageKey.MAX_VALUE_TXT_VIOLATED.defaultMessage,
@@ -449,8 +439,7 @@ public class ConfigDescriptionValidatorTest {
                         MessageKey.DATA_TYPE_VIOLATED.key, Long.class, Type.DECIMAL),
                 new ConfigValidationMessage(DECIMAL_MAX_PARAM_NAME,
                         MessageKey.MAX_VALUE_NUMERIC_VIOLATED.defaultMessage, MessageKey.MAX_VALUE_NUMERIC_VIOLATED.key,
-                        DECIMAL_MAX.toString()))
-                .collect(toList());
+                        DECIMAL_MAX.toString()));
         params.put(BOOL_REQUIRED_PARAM_NAME, null);
         params.put(TXT_REQUIRED_PARAM_NAME, null);
         params.put(TXT_MAX_PARAM_NAME, String.valueOf(MAX_VIOLATED));
@@ -489,28 +478,11 @@ public class ConfigDescriptionValidatorTest {
         configDescriptionValidator.validate(params, CONFIG_DESCRIPTION_URI);
     }
 
-    @Test
-    public void assertValidateThrowsNPEforNullParamerters() {
-        assertThrows(NullPointerException.class,
-                () -> configDescriptionValidator.validate(null, CONFIG_DESCRIPTION_URI));
-    }
-
-    @Test
-    public void assertValidateThrowsNPEforNullConfigDescriptionUri() {
-        assertThrows(NullPointerException.class, () -> configDescriptionValidator.validate(params, null));
-    }
-
     @Test
     public void assertValidateCanHandleUnknownURIs() throws Exception {
         configDescriptionValidator.validate(params, new URI(UNKNOWN));
     }
 
-    @Test
-    public void assertValidateCanHandleSituationsWithoutConfigDescriptionRegistry() {
-        configDescriptionValidator.setConfigDescriptionRegistry(null);
-        configDescriptionValidator.validate(params, CONFIG_DESCRIPTION_URI);
-    }
-
     @SuppressWarnings("unchecked")
     private static List<ConfigValidationMessage> getConfigValidationMessages(ConfigValidationException cve) {
         try {
@@ -521,8 +493,4 @@ public class ConfigDescriptionValidatorTest {
             throw new IllegalStateException("Failed to get configValidationMessages: " + e.getMessage(), e);
         }
     }
-
-    private void failBecauseOfMissingConfigValidationException() {
-        fail("A config validation exception was expected but it was not thrown");
-    }
 }
diff --git a/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigValidationExceptionTest.java b/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigValidationExceptionTest.java
index f5830713bd..c0b9cc30c8 100644
--- a/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigValidationExceptionTest.java
+++ b/bundles/org.openhab.core.config.core/src/test/java/org/openhab/core/config/core/internal/validation/ConfigValidationExceptionTest.java
@@ -139,8 +139,7 @@ public class ConfigValidationExceptionTest {
     }
 
     @Test
-    @SuppressWarnings("unused")
-    public void assertThatNPEisThrownForNullConfigValidationMessages() {
+    public void assertThatNPEIsThrownForNullConfigValidationMessages() {
         assertThrows(NullPointerException.class,
                 () -> new ConfigValidationException(BUNDLE, TRANSLATION_PROVIDER, null));
     }
diff --git a/bundles/org.openhab.core.thing/src/main/java/org/openhab/core/thing/internal/ThingManagerImpl.java b/bundles/org.openhab.core.thing/src/main/java/org/openhab/core/thing/internal/ThingManagerImpl.java
index d50875ae79..f4ce81815f 100644
--- a/bundles/org.openhab.core.thing/src/main/java/org/openhab/core/thing/internal/ThingManagerImpl.java
+++ b/bundles/org.openhab.core.thing/src/main/java/org/openhab/core/thing/internal/ThingManagerImpl.java
@@ -286,16 +286,22 @@ public class ThingManagerImpl
         @Override
         public void validateConfigurationParameters(Thing thing, Map<String, Object> configurationParameters) {
             ThingType thingType = thingTypeRegistry.getThingType(thing.getThingTypeUID());
-            if (thingType != null && thingType.getConfigDescriptionURI() != null) {
-                configDescriptionValidator.validate(configurationParameters, thingType.getConfigDescriptionURI());
+            if (thingType != null) {
+                URI configDescriptionURI = thingType.getConfigDescriptionURI();
+                if (configDescriptionURI != null) {
+                    configDescriptionValidator.validate(configurationParameters, configDescriptionURI);
+                }
             }
         }
 
         @Override
         public void validateConfigurationParameters(Channel channel, Map<String, Object> configurationParameters) {
             ChannelType channelType = channelTypeRegistry.getChannelType(channel.getChannelTypeUID());
-            if (channelType != null && channelType.getConfigDescriptionURI() != null) {
-                configDescriptionValidator.validate(configurationParameters, channelType.getConfigDescriptionURI());
+            if (channelType != null) {
+                URI configDescriptionURI = channelType.getConfigDescriptionURI();
+                if (configDescriptionURI != null) {
+                    configDescriptionValidator.validate(configurationParameters, configDescriptionURI);
+                }
             }
         }