diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckConfigurationApi.java b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckConfigurationApi.java
index 0e84ed9..56d569c 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckConfigurationApi.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckConfigurationApi.java
@@ -76,7 +76,7 @@
                         for(final Map.Entry<String, PropertyValidationResult> propEntry : entry.getValue().getPropertyResults().entrySet()) {
                             if ( !propEntry.getValue().isValid() ) {
                                 for(final String err : propEntry.getValue().getErrors()) {
-                                    context.reportWarning("Configuration " + entry.getKey() + "." + propEntry.getKey() + " : " + err);
+                                    context.reportError("Configuration " + entry.getKey() + "." + propEntry.getKey() + " : " + err);
                                 }
                             }
                         }
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckConfigurationApiTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckConfigurationApiTest.java
new file mode 100644
index 0000000..7cd7422
--- /dev/null
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckConfigurationApiTest.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.feature.extension.apiregions.analyser;
+
+import static org.mockito.Mockito.when;
+
+import org.apache.sling.feature.ArtifactId;
+import org.apache.sling.feature.Configuration;
+import org.apache.sling.feature.Feature;
+import org.apache.sling.feature.analyser.task.AnalyserTaskContext;
+import org.apache.sling.feature.extension.apiregions.api.config.ConfigurationApi;
+import org.apache.sling.feature.extension.apiregions.api.config.ConfigurationDescription;
+import org.apache.sling.feature.extension.apiregions.api.config.PropertyDescription;
+import org.apache.sling.feature.extension.apiregions.api.config.PropertyType;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class CheckConfigurationApiTest {
+    
+    private CheckConfigurationApi analyser = new CheckConfigurationApi();
+
+    private AnalyserTaskContext newContext(final Feature f) {
+        final AnalyserTaskContext context = Mockito.mock(AnalyserTaskContext.class);
+
+        when(context.getFeature()).thenReturn(f);
+        
+        return context;
+    }
+
+    @Test public void testValidateFeature() throws Exception {
+        final Feature f = new Feature(ArtifactId.parse("g:a:1"));
+
+        final Configuration c = new Configuration("pid");
+        c.getProperties().put("a", "x");
+        f.getConfigurations().add(c);
+
+        final ConfigurationApi api = new ConfigurationApi();
+        api.getConfigurationDescriptions().put("pid", new ConfigurationDescription());
+        api.getConfigurationDescriptions().get("pid").getPropertyDescriptions().put("a", new PropertyDescription());
+        ConfigurationApi.setConfigurationApi(f, api);
+
+        // no error
+        AnalyserTaskContext context  = newContext(f);
+        analyser.execute(context);
+        Mockito.verify(context, Mockito.never()).reportError(Mockito.anyString());
+        Mockito.verify(context, Mockito.never()).reportWarning(Mockito.anyString());
+
+        // integer -> validation error
+        api.getConfigurationDescriptions().get("pid").getPropertyDescriptions().get("a").setType(PropertyType.INTEGER);
+        ConfigurationApi.setConfigurationApi(f, api);
+        context = newContext(f);
+        analyser.execute(context);
+        Mockito.verify(context, Mockito.atLeastOnce()).reportError(Mockito.anyString());
+        Mockito.verify(context, Mockito.never()).reportWarning(Mockito.anyString());
+    }
+}
