diff --git a/code/api/src/main/java/org/apache/tamaya/Configuration.java b/code/api/src/main/java/org/apache/tamaya/Configuration.java
index 188a3ff..2b63d29 100644
--- a/code/api/src/main/java/org/apache/tamaya/Configuration.java
+++ b/code/api/src/main/java/org/apache/tamaya/Configuration.java
@@ -47,79 +47,9 @@
     String get(String key);
 
     /**
-     * Access a property.
-     *
-     * @param key the property's key, not null.
-     * @param defaultValue value to be returned, if no value is present.
-     * @return the property's keys.
-     */
-    String getOrDefault(String key, final String defaultValue);
-
-//    /**
-//     * Access a property providing a value supplier called, if no configured value is available.
-//     *
-//     * @param key the property's key, not null.
-//     * @param defaultValueSupplier value supplier to be called, if no value is present.
-//     * @return the property value.
-//     */
-//    default String getOrDefault(String key, Supplier<String> defaultValueSupplier){
-//        String value = get(key);
-//        if(value==null){
-//            return defaultValueSupplier.supply();
-//        }
-//        return value;
-//    }
-
-    /**
      * Access all currently known configuration properties as a full {@code Map<String,String>}.
      * @return all currently known configuration properties.
      */
     Map<String,String> getProperties();
 
-//    /**
-//     * Access a typed property providing a conversion.
-//     *
-//     * @param key the property's key, not null.
-//     * @param conversion the value conversion, called if a configured value is present for the given key,
-//     *                   not null.
-//     * @return the property value, or null, if no such value has been found.
-//     */
-//    default <T> T get(String key, Function<String,T> conversion){
-//        String value = get(key);
-//        if(value!=null){
-//            return conversion.apply(value);
-//        }
-//        return null;
-//    }
-//
-//    /**
-//     * Access a typed property providing a conversion and a default value.
-//     *
-//     * @param key the property's key, not null.
-//     * @param conversion the value conversion, called if a configured value is present for the given key,
-//     *                   not null.
-//     * @param defaultValue the default value to be returned, if no configured value has been found, including
-//     *                     {@code null}.
-//     * @return the property value, or null, if no such value has been found.
-//     */
-//    default <T> T getOrDefault(String key, Function<String,T> conversion, final T defaultValue){
-//        return getOrDefault(key, conversion, () -> defaultValue);
-//    }
-//    /**
-//     * Access a typed property providing a conversion and a default value supplier.
-//     *
-//     * @param key the property's key, not null.
-//     * @param conversion the value conversion, called if a configured value is present for the given key,
-//     *                   not null.
-//     * @param defaultValueSupplier the default value supplier to be called, if no configured value has been found..
-//     * @return the property value, or null, if no such value has been found.
-//     */
-//    default <T> T getOrDefault(String key, Function<String,T> conversion, Supplier<T> defaultValueSupplier){
-//        String value = get(key);
-//        if(value!=null){
-//            return conversion.apply(value);
-//        }
-//        return defaultValueSupplier.supply();
-//    }
-
 }
diff --git a/code/api/src/test/java/org/apache/tamaya/ConfigExceptionTest.java b/code/api/src/test/java/org/apache/tamaya/ConfigExceptionTest.java
index 09b8d88..fa7da0a 100644
--- a/code/api/src/test/java/org/apache/tamaya/ConfigExceptionTest.java
+++ b/code/api/src/test/java/org/apache/tamaya/ConfigExceptionTest.java
@@ -1,45 +1,45 @@
-///*
-// * 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.tamaya;
-//
-//import org.junit.Test;
-//
-//import static org.junit.Assert.*;
-//
-///**
-// * Tests instantiating {@link ConfigException}.
-// */
-//public class ConfigExceptionTest {
-//
-//    @Test
-//    public void testCreationMessage(){
-//        ConfigException ex = new ConfigException("test");
-//        assertNull(ex.getCause());
-//        assertEquals(ex.getMessage(), "test");
-//    }
-//
-//    @Test
-//    public void testCreationMessageThrowable(){
-//        Exception e = new IllegalStateException("blabla");
-//        ConfigException ex = new ConfigException("test", e);
-//        assertTrue(ex.getCause() == e);
-//        assertEquals("test", ex.getMessage());
-//    }
-//
-//}
\ No newline at end of file
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests instantiating {@link ConfigException}.
+ */
+public class ConfigExceptionTest {
+
+    @Test
+    public void testCreationMessage(){
+        ConfigException ex = new ConfigException("test");
+        assertNull(ex.getCause());
+        assertEquals(ex.getMessage(), "test");
+    }
+
+    @Test
+    public void testCreationMessageThrowable(){
+        Exception e = new IllegalStateException("blabla");
+        ConfigException ex = new ConfigException("test", e);
+        assertTrue(ex.getCause() == e);
+        assertEquals("test", ex.getMessage());
+    }
+
+}
\ No newline at end of file
diff --git a/code/api/src/test/java/org/apache/tamaya/TestConfiguration.java b/code/api/src/test/java/org/apache/tamaya/TestConfiguration.java
index a324be1..5038bc7 100644
--- a/code/api/src/test/java/org/apache/tamaya/TestConfiguration.java
+++ b/code/api/src/test/java/org/apache/tamaya/TestConfiguration.java
@@ -46,87 +46,6 @@
     }
 
     @Override
-    public String getOrDefault(String key, String defaultValue) {
-        String val = get(key);
-        if(val==null){
-            return defaultValue;
-        }
-        return val;
-    }
-
-//    @Override
-//    public <T> T getOrDefault(String key, Class<T> type, T defaultValue) {
-//        T val = get(key, type);
-//        if(val==null){
-//            return defaultValue;
-//        }
-//        return val;
-//    }
-//
-//    @Override
-//    public <T> T get(String key, Class<T> type) {
-//        if(type.equals(Long.class)){
-//            return (T)(Object)Long.MAX_VALUE;
-//        }
-//        else if(type.equals(Integer.class)){
-//            return (T)(Object) Integer.MAX_VALUE;
-//        }
-//        else if(type.equals(Double.class)){
-//            return (T)(Object) Double.MAX_VALUE;
-//        }
-//        else if(type.equals(Float.class)){
-//            return (T)(Object) Float.MAX_VALUE;
-//        }
-//        else if(type.equals(Short.class)){
-//            return (T)(Object) Short.MAX_VALUE;
-//        }
-//        else if(type.equals(Byte.class)){
-//            return (T)(Object) Byte.MAX_VALUE;
-//        }
-//        else if(type.equals(Boolean.class)){
-//            if("booleanTrue".equals(key)) {
-//                return (T)Boolean.TRUE;
-//            }
-//            else{
-//                return (T)Boolean.FALSE;
-//            }
-//        }
-//        else if(type.equals(String.class)){
-//            return (T)"aStringValue";
-//        }
-//        throw new ConfigException("No such property: " + key);
-//    }
-//
-//    @Override
-//    public <T> T get(String key, TypeLiteral<T> type) {
-//        throw new RuntimeException("Method not implemented yet.");
-//    }
-//
-//    @Override
-//    public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) {
-//        T val = get(key, type);
-//        if(val==null){
-//            return defaultValue;
-//        }
-//        return val;
-//    }
-//
-//    @Override
-//    public Configuration with(ConfigOperator operator) {
-//        return null;
-//    }
-//
-//    @Override
-//    public <T> T query(ConfigQuery<T> query) {
-//        throw new RuntimeException("Method not implemented yet.");
-//    }
-//
-//    @Override
-//    public ConfigurationContext getContext() {
-//        return null;
-//    }
-
-    @Override
     public Map<String, String> getProperties() {
         throw new RuntimeException("Method not implemented yet.");
     }
diff --git a/code/api/src/test/java/org/apache/tamaya/TypeLiteralTest.java b/code/api/src/test/java/org/apache/tamaya/TypeLiteralTest.java
deleted file mode 100644
index a04636d..0000000
--- a/code/api/src/test/java/org/apache/tamaya/TypeLiteralTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-///*
-// * Licensed to the Apache Software Foundation (ASF) under one
-// * or more contributor license agreements.  See the NOTICE file
-// * distributed with this work for additional information
-// * regarding copyright ownership.  The ASF licenses this file
-// * to you under the Apache License, Version 2.0 (the
-// * "License"); you may not use this file except in compliance
-// * with the License.  You may obtain a copy of the License at
-// *
-// *   http://www.apache.org/licenses/LICENSE-2.0
-// *
-// * Unless required by applicable law or agreed to in writing,
-// * software distributed under the License is distributed on an
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// * KIND, either express or implied.  See the License for the
-// * specific language governing permissions and limitations
-// * under the License.
-// */
-//package org.apache.tamaya;
-//
-//import org.junit.Test;
-//
-//import java.util.ArrayList;
-//import java.util.List;
-//
-//import static org.junit.Assert.assertEquals;
-//
-///**
-// * Tests for the {@link TypeLiteral} class.
-// */
-//public class TypeLiteralTest {
-//
-//    @Test
-//    public void test_constrcutor(){
-//        TypeLiteral<List<String>> listTypeLiteral = new TypeLiteral<List<String>>(){};
-//        assertEquals(List.class, listTypeLiteral.getRawType());
-//        assertEquals(String.class, TypeLiteral.getTypeParameters(listTypeLiteral.getType())[0]);
-//    }
-//
-//    @Test
-//    public void test_of(){
-//        class MyListClass extends ArrayList<String>{}
-//        TypeLiteral<MyListClass> listTypeLiteral = TypeLiteral.of(MyListClass.class);
-//        assertEquals(MyListClass.class, listTypeLiteral.getRawType());
-//        assertEquals(MyListClass.class, listTypeLiteral.getType());
-//    }
-//
-//    @Test
-//    public void test_getTypeParameter(){
-//        TypeLiteral<List<String>> listTypeLiteral = new TypeLiteral<List<String>>(){};
-//        assertEquals(List.class, listTypeLiteral.getRawType());
-//        assertEquals(String.class, TypeLiteral.getTypeParameters(listTypeLiteral.getType())[0]);
-//    }
-//
-//    @Test
-//    public void test_getGenericInterfaceTypeParameter(){
-//        class MyListClass extends ArrayList<String> implements List<String>{}
-//        assertEquals(String.class, TypeLiteral.getGenericInterfaceTypeParameters(MyListClass.class, List.class)[0]);
-//    }
-//
-//}
diff --git a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi b/code/api/src/test/resources/META-INF/services/org.apache.tamaya.Configuration
similarity index 94%
rename from code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
rename to code/api/src/test/resources/META-INF/services/org.apache.tamaya.Configuration
index b9c5ba5..cb8aac4 100644
--- a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
+++ b/code/api/src/test/resources/META-INF/services/org.apache.tamaya.Configuration
@@ -16,4 +16,4 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-org.apache.tamaya.TestConfigurationProvider
+org.apache.tamaya.TestConfiguration
diff --git a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ServiceContext b/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ServiceContext
deleted file mode 100644
index 8da8805..0000000
--- a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ServiceContext
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy current 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.
-#
-org.apache.tamaya.builder.spi.TestServiceContext
\ No newline at end of file
diff --git a/code/core/pom.xml b/code/core/pom.xml
index 94e966e..5e7f358 100644
--- a/code/core/pom.xml
+++ b/code/core/pom.xml
@@ -30,10 +30,6 @@
     <name>Apache Tamaya Core Implementation</name>
     <packaging>bundle</packaging>
 
-    <properties>
-        <osgi.compendium.version>5.0.0</osgi.compendium.version>
-     </properties>
-
     <dependencies>
         <dependency>
             <groupId>org.apache.tamaya</groupId>
@@ -48,20 +44,6 @@
             <groupId>org.hamcrest</groupId>
             <artifactId>java-hamcrest</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-            <scope>provided</scope>
-            <version>${osgi.compendium.version}</version>
-            <optional>true</optional>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <version>${osgi.version}</version>
-            <scope>provided</scope>
-            <optional>true</optional>
-        </dependency>
     </dependencies>
 
     <build>
diff --git a/examples/7-builder-example/src/main/java/org/apache/tamaya/examples/builder/UsingABuilderExample.java b/examples/7-builder-example/src/main/java/org/apache/tamaya/examples/builder/UsingABuilderExample.java
index de73854..13f5aab 100644
--- a/examples/7-builder-example/src/main/java/org/apache/tamaya/examples/builder/UsingABuilderExample.java
+++ b/examples/7-builder-example/src/main/java/org/apache/tamaya/examples/builder/UsingABuilderExample.java
@@ -19,7 +19,7 @@
 package org.apache.tamaya.examples.builder;
 
 import org.apache.tamaya.Configuration;
-import org.apache.tamaya.builder.ConfigurationBuilder;
+import org.apache.tamaya.builder.PropertySourceBasedConfigurationBuilder;
 import org.apache.tamaya.resource.ConfigResources;
 
 
@@ -33,7 +33,7 @@
 
     public static void main(String... args) {
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
         Configuration config = builder.addPropertySources(ConfigResources.getResourceResolver().getResources("META-INF/boot/*.ini"))
                 .addPropertySources(ConfigResources.getResourceResolver().getResources("META-INF/config/*.properties"))
                 .enableProvidedPropertyConverters()
diff --git a/modules/adaptersupport/pom.xml b/modules/adaptersupport/pom.xml
new file mode 100644
index 0000000..798c84f
--- /dev/null
+++ b/modules/adaptersupport/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy current the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.tamaya.ext</groupId>
+        <artifactId>tamaya-extensions</artifactId>
+        <version>0.3-incubating-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>tamaya-adaptersupport</artifactId>
+    <name>Apache Tamaya Modules - Configuration Adapter Support</name>
+    <packaging>jar</packaging> <!-- bundle -->
+
+    <inceptionYear>2016</inceptionYear>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.tamaya</groupId>
+            <artifactId>tamaya-api</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-servicecontext</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>java-hamcrest</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+
+
+    </dependencies>
+
+</project>
diff --git a/modules/adaptersupport/src/main/java/org/apache/tamaya/adapter/AdapterManager.java b/modules/adaptersupport/src/main/java/org/apache/tamaya/adapter/AdapterManager.java
new file mode 100644
index 0000000..4ae50ac
--- /dev/null
+++ b/modules/adaptersupport/src/main/java/org/apache/tamaya/adapter/AdapterManager.java
@@ -0,0 +1,143 @@
+/*
+ * 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.tamaya.adapter;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.adapter.spi.ConfigurationAdapter;
+import org.apache.tamaya.servicecontext.ServiceContext;
+import org.apache.tamaya.servicecontext.ServiceContextManager;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Manager that deals with {@link ConfigurationAdapter} instances.
+ * This class is thread-safe.
+ */
+public final class AdapterManager implements ConfigurationAdapter{
+    /**
+     * The logger used.
+     */
+    private static final Logger LOG = Logger.getLogger(AdapterManager.class.getName());
+    /**
+     * The registered converters.
+     */
+    private final List<ConfigurationAdapter> adapters = new ArrayList<>();
+
+    private static final AdapterManager INSTANCE = new AdapterManager();
+
+    /**
+     * The lock used.
+     */
+    private final ReadWriteLock lock = new ReentrantReadWriteLock();
+
+    private static final Comparator<Object> PRIORITY_COMPARATOR = new Comparator<Object>() {
+
+        @Override
+        public int compare(Object o1, Object o2) {
+            ServiceContext serviceContext = ServiceContextManager.getServiceContext();
+            int prio = serviceContext.getPriority(o1) - serviceContext.getPriority(o2);
+            if (prio < 0) {
+                return 1;
+            } else if (prio > 0) {
+                return -1;
+            } else {
+                return o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName());
+            }
+        }
+    };
+
+    /**
+     * Get the instance of the adapter manager.
+     * @return the instance of the adapter manager, not null.
+     */
+    public static final AdapterManager getInstance(){
+        return INSTANCE;
+    }
+
+    /**
+     * Constructor.
+     */
+    private AdapterManager() {
+        this.adapters.addAll(ServiceContextManager.getServiceContext().getServices(ConfigurationAdapter.class));
+        Collections.sort(this.adapters, PRIORITY_COMPARATOR);
+    }
+
+    /**
+     * Registers a new adapter instance.
+     *
+     * @param adapter the new adapter, not null.
+     */
+    public void registerAdapter(ConfigurationAdapter adapter) {
+        Lock writeLock = lock.writeLock();
+        try {
+            writeLock.lock();
+            this.adapters.addAll(ServiceContextManager.getServiceContext().getServices(ConfigurationAdapter.class));
+            Collections.sort(this.adapters, PRIORITY_COMPARATOR);
+        } finally {
+            writeLock.unlock();
+        }
+    }
+
+    /**
+     * Get a list of all currently loaded {@link ConfigurationAdapter} in order of relevance.
+     *
+     * @return the list of currently available adapters.
+     */
+    public List<ConfigurationAdapter> getAdapters() {
+        Lock readLock = lock.readLock();
+        try {
+            readLock.lock();
+            return new ArrayList<>(this.adapters);
+        } finally {
+            readLock.unlock();
+        }
+    }
+
+    @Override
+    public <T> T adapt(Configuration configuration, Class<T> targetType) {
+        for(ConfigurationAdapter adapter:adapters){
+            try {
+                Object o = adapter.adapt(configuration, targetType);
+                if(o!=null){
+                    return (T)o;
+                }
+            }catch(Exception e){
+                LOG.log(Level.SEVERE, "Error adapting configuration to: " + targetType.getName(), e);
+            }
+        }
+        throw new ConfigException("Cannot adapt configuration to " + targetType.getName());
+    }
+
+
+    @Override
+    public String toString() {
+        return "AdapterManager{" +
+                "adapters=" + adapters +
+                '}';
+    }
+}
diff --git a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java b/modules/adaptersupport/src/main/java/org/apache/tamaya/adapter/package-info.java
similarity index 68%
copy from code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
copy to modules/adaptersupport/src/main/java/org/apache/tamaya/adapter/package-info.java
index cc66d35..0442f0f 100644
--- a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
+++ b/modules/adaptersupport/src/main/java/org/apache/tamaya/adapter/package-info.java
@@ -16,19 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya;
-
-
 /**
- * Test Configuration class, that is used to testdata the default methods provided by the API.
+ * This package provides a singleton managing the currently available
+ * {@link org.apache.tamaya.adapter.spi.org.apache.tamaya.adapter.spi.ConfigurationAdapter}
+ * instances. It also supports creating proxy interfaces supporting multiple adapted types
+ * at once.
+ *
+ * @see org.apache.tamaya.Configuration
  */
-public class TestConfigurationProvider extends ConfigurationProvider {
-
-    private static final Configuration config = new TestConfiguration();
-
-    @Override
-    public Configuration getConfiguration() {
-        return config;
-    }
-
-}
+package org.apache.tamaya.adapter;
\ No newline at end of file
diff --git a/modules/adaptersupport/src/main/java/org/apache/tamaya/adapter/spi/ConfigurationAdapter.java b/modules/adaptersupport/src/main/java/org/apache/tamaya/adapter/spi/ConfigurationAdapter.java
new file mode 100644
index 0000000..79ea7a1
--- /dev/null
+++ b/modules/adaptersupport/src/main/java/org/apache/tamaya/adapter/spi/ConfigurationAdapter.java
@@ -0,0 +1,52 @@
+/*
+ * 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.tamaya.adapter.spi;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.Configuration;
+
+import java.util.Map;
+
+/**
+ * <p>A adapter that transforms/adapts a {@link org.apache.tamaya.Configuration} to implement
+ * another interface. Adapters are ordered internally by their annotated {@link javax.annotation.Priority}
+ * value (highest first). Returning a non null value for the adapted target type ends traversal of
+ * possible adapters and returns immedeately the result.
+ *
+ * Normally adapters should not be cached. Caching is within the responsibility of the caller logic.
+ * <h3>Implementation Requirements</h3>
+ * Implementations of this interface must be
+ * <ul>
+ *  <li>Thread safe</li>
+ *  <li>Immutable</li>
+ * </ul>
+ */
+public interface ConfigurationAdapter {
+
+    /**
+     * Adapts a configuration. If this factory is not capable of providing the required
+     * target type, it is safe to return {@code null}.
+     *
+     * @param configuration the configuration to be adapted, not null.
+     * @param targetType the target type, not null.
+     * @return the adapter, or null.
+     */
+    <T> T adapt(Configuration configuration, Class<T> targetType);
+
+}
diff --git a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi b/modules/adaptersupport/src/test/resources/META-INF/services/org.apache.tamaya.adapter.spi.ConfigurationAdapter
similarity index 93%
copy from code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
copy to modules/adaptersupport/src/test/resources/META-INF/services/org.apache.tamaya.adapter.spi.ConfigurationAdapter
index b9c5ba5..f3199f2 100644
--- a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
+++ b/modules/adaptersupport/src/test/resources/META-INF/services/org.apache.tamaya.adapter.spi.ConfigurationAdapter
@@ -16,4 +16,3 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-org.apache.tamaya.TestConfigurationProvider
diff --git a/modules/builder/pom.xml b/modules/builder/pom.xml
index 96f6244..815867c 100644
--- a/modules/builder/pom.xml
+++ b/modules/builder/pom.xml
@@ -39,6 +39,21 @@
             <version>${project.version}</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-adaptersupport</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-types</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-servicecontext</artifactId>
+            <version>${project.version}</version>
+        </dependency>
 
         <dependency>
             <groupId>org.apache.tamaya.ext</groupId>
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java b/modules/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java
deleted file mode 100644
index 6188f83..0000000
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/ConfigurationBuilder.java
+++ /dev/null
@@ -1,605 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.builder;
-
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.builder.spi.PropertyConverter;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.format.ConfigurationData;
-import org.apache.tamaya.format.ConfigurationFormats;
-import org.apache.tamaya.format.FlattenedDefaultPropertySource;
-import org.apache.tamaya.builder.spi.ConfigurationContext;
-import org.apache.tamaya.builder.spi.PropertyFilter;
-import org.apache.tamaya.builder.spi.PropertySource;
-import org.apache.tamaya.builder.spi.PropertySourceProvider;
-import org.apache.tamaya.builder.spi.PropertyValueCombinationPolicy;
-import org.apache.tamaya.spisupport.DefaultConfiguration;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Objects;
-
-import static java.lang.String.format;
-
-/**
- * <p>Builder class used for building a configuration manually without relying
- * only on the Service Provider Interface API.</p>
- *
- * <p><strong>Features of the builder</strong></p>
- *
- * <ol>
- *   <li>Adding of property converters manually</li>
- *   <li>Adding of property sources directly</li>
- *   <li>Adding of property sources via URL</li>
- *   <li>Adding of property source providers directly</li>
- *   <li>Enabling and disabling of via SPI mechanism provided resources as converters,
- *       property sources, etc.</li>
- * </ol>
- *
- * <p><strong>Example</strong></p>
- *
- * <pre>{@code ConfigurationBuilder builder = new ConfigurationBuilder();
- * builder.disableProvidedPropertySources()           // Do not load provided property
- *        .disableProvidedPropertySourceProviders()   // sources and providers automatically
- *        .addPropertySource("file:/etc/conf.properties"); // Load properties from conf.properties
- *
- * Configuration config = builder.build();
- * }</pre>
- *
- * <p><strong>Support for configuration formats</strong></p>
- *
- * The configuration builder allows you to put property resources
- * via a URL, as shown in the code example above, without implementing
- * a {@link PropertySource PropertySource} or providing an
- * instance of a {@link PropertySource PropertySource}.
- * If a property resource in
- * a specific format can be added to configuration builder or not depends
- * on the available implementations of
- * {@link org.apache.tamaya.format.ConfigurationFormat} in the classpath.
- * Which formats are available can be checked via
- * {@link org.apache.tamaya.format.ConfigurationFormats#getFormats()}.
- */
-public class ConfigurationBuilder {
-    /** Builder used to create new ConfigurationContext instances. */
-    private final ProgrammaticConfigurationContext.Builder contextBuilder = new ProgrammaticConfigurationContext.Builder();
-
-    /**
-     * Flag if the config has already been built.
-     * Configuration can be built only once
-     */
-    private boolean built;
-
-    /**
-     * Flag if all existing property converter service providers
-     * should be loaded if the configuration is build.
-     */
-    private boolean loadProvidedPropertyConverters = true;
-
-    /**
-     * Flag if all existing property source service providers
-     * will be loaded if the configuration is build.
-     */
-    private boolean loadProvidedPropertySources = false;
-    private boolean loadProvidedPropertySourceProviders = false;
-
-    private boolean isLoadProvidedPropertyFilters = false;
-
-    /**
-     * Creates a new builder instance.
-     */
-    public ConfigurationBuilder() {
-    }
-
-    /**
-     * Allows to set configuration context during unit tests.
-     */
-    ConfigurationBuilder setConfigurationContext(ConfigurationContext configurationContext) {
-        //noinspection deprecation
-        contextBuilder.setConfigurationContext(configurationContext);
-        return this;
-    }
-
-    /**
-     * Adds one resources with properties in an arbitrary format
-     * to the configuration to be build.
-     *
-     * <p>If a specific format is supported depends on the available
-     * {@link org.apache.tamaya.format.ConfigurationFormat} implementations.</p>
-     *
-     * <pre>{@code URL resource = new URL("file:/etc/service/config.json");
-     *
-     * builder.addPropertySources(resource);}
-     * </pre>
-     *
-     * @param url resource with properties for the the configuration to be build.
-     *
-     * @return the builder instance currently used
-     *
-     * @see org.apache.tamaya.format.ConfigurationFormat
-     * @see org.apache.tamaya.format.ConfigurationFormats#getFormats()
-     */
-    public ConfigurationBuilder addPropertySource(URL url) {
-        try {
-            ConfigurationData data = getConfigurationDataFromURL(url);
-
-            FlattenedDefaultPropertySource propertySource = new FlattenedDefaultPropertySource(data);
-            addPropertySources(propertySource);
-        } catch (IOException e) {
-            throw new ConfigException("Failed to read " + url.toString(), e);
-        }
-        return this;
-    }
-
-    protected ConfigurationData getConfigurationDataFromURL(URL url) throws IOException {
-        ConfigurationData data = ConfigurationFormats.readConfigurationData(url);
-
-        if (null == data) {
-            String mesg = format("No configuration format found which is able " +
-                                 "to read properties from %s.", url.toString());
-
-            throw new ConfigException(mesg);
-        }
-
-        return data;
-    }
-
-    /**
-     * Adds one or more resources with properties in an arbitrary format
-     * to the configuration to be build.
-     *
-     * <p>If a specific format is supported depends on the available
-     * {@link org.apache.tamaya.format.ConfigurationFormat} implementations.</p>
-     *
-     *<pre>{@code URL first = new URL("file:/etc/service/config.json");
-     * URL second = new URL("file:/etc/defaults/values.properties");
-     *
-     * builder.addPropertySources(first, second);}
-     *</pre>
-     *
-     * @param urls list of resources with properties for the configuration to be
-     *             build.
-     *
-     * @return the builder instance currently used
-     *
-     * @see org.apache.tamaya.format.ConfigurationFormat
-     * @see org.apache.tamaya.format.ConfigurationFormats#getFormats()
-     */
-    public ConfigurationBuilder addPropertySources(URL... urls) {
-        for(URL url:urls){
-            if(url!=null){
-                addPropertySource(url);
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Adds one or more resources with properties in an arbitrary format
-     * to the configuration to be build.
-     *
-     * <p>If a specific format is supported depends on the available
-     * {@link org.apache.tamaya.format.ConfigurationFormat} implementations.</p>
-     *
-     *<pre>{@code URL first = new URL("file:/etc/service/config.json");
-     * URL second = new URL("file:/etc/defaults/values.properties");
-     *
-     * builder.addPropertySources(first, second);}
-     *</pre>
-     *
-     * @param urls list of resources with properties for the configuration to be
-     *             build.
-     *
-     * @return the builder instance currently used
-     *
-     * @see org.apache.tamaya.format.ConfigurationFormat
-     * @see org.apache.tamaya.format.ConfigurationFormats#getFormats()
-     */
-    public ConfigurationBuilder addPropertySources(Collection<URL> urls) {
-        for(URL url:urls) {
-            if (url != null) {
-                addPropertySource(url);
-            }
-        }
-        return this;
-    }
-
-
-    /**
-     * Adds one or more resources with properties in an arbitrary format
-     * to the configuration to be build.
-     *
-     * <p>If a specific format is supported depends on the available
-     * {@link org.apache.tamaya.format.ConfigurationFormat} implementations.</p>
-     *
-     *<pre>{@code builder.addPropertySources("file:/etc/service/config.json",
-     *                            "file:/etc/defaults/values.properties");}
-     *</pre>
-     *
-     * @param urls list of resources with properties for the configuration to be
-     *             build.
-     *
-     * @return the builder instance currently used
-     *
-     * @see org.apache.tamaya.format.ConfigurationFormat
-     * @see org.apache.tamaya.format.ConfigurationFormats#getFormats()
-     */
-    public ConfigurationBuilder addPropertySources(String... urls) {
-        for(String url:urls) {
-            if (url != null) {
-                try{
-                    addPropertySource(new URL(url));
-                } catch(Exception e){
-                    throw new ConfigException("Invalid URL: " + url);
-                }
-            }
-        }
-        return this;
-    }
-
-    /**
-     * Adds one or more property source instances to the configuration to be build.
-     *
-     *<pre>{@code PropertySource first = new CustomPropertySource();
-     * PropertySource second = new YetAnotherPropertySource();
-     *
-     * builder.addPropertySources(first, second)};
-     *</pre>
-     *
-     * @param sources list of property source instances with properties for the
-     *                configuration to be build.
-     *
-     * @return the builder instance currently used
-     *
-     * @see PropertySource
-     */
-    public ConfigurationBuilder addPropertySources(PropertySource... sources){
-        checkBuilderState();
-
-        contextBuilder.addPropertySources(Objects.requireNonNull(sources));
-        return this;
-    }
-
-    private void checkBuilderState() {
-        if (built) {
-            throw new IllegalStateException("Configuration has already been build.");
-        }
-    }
-
-    /**
-     * Adds one or more property source provider instances to the configuration to be build.
-     *
-     * <pre>{@code PropertySourceProvider jc = new JavaConfigurationProvider();
-     *
-     * builder.addPropertySources(jc)};
-     * </pre>
-     *
-     * @param providers list of property source provider instances each providing a set
-     *                  of property source instances for the configuration to be build.
-     *
-     * @return the builder instance currently used
-     *
-     * @see PropertySourceProvider
-     */
-    public ConfigurationBuilder addPropertySourceProviders(PropertySourceProvider... providers){
-        contextBuilder.addPropertySourceProviders(providers);
-        return this;
-    }
-
-    /**
-     * Adds one or more property filter instances to the configuration to be build.
-     *
-     * <pre>{@code PropertyFilter quoteReplacingFilter = new QuoteFilter();
-     * PropertyFilter commaRemovingFilter = new CommaFilter();
-     *
-     * builder.addPropertyFilters(commaRemovingFilter, quoteReplacingFilter)};
-     * </pre>
-     *
-     * @param filters list of property filter instances which should be applied
-     *                to the properties of the configuration to be build.
-     *
-     * @return the builder instance currently used
-     *
-     * @see PropertyFilter
-     * @see #disableProvidedPropertyFilters()
-     * @see #enabledProvidedPropertyFilters()
-     */
-    public ConfigurationBuilder addPropertyFilters(PropertyFilter... filters){
-        Objects.requireNonNull(filters);
-
-        contextBuilder.addPropertyFilters(filters);
-        return this;
-    }
-
-
-    /**
-     * @param propertyValueCombinationPolicy combination policy to use for this builder. 
-     * @return the builder instance currently in use.
-     */
-    public ConfigurationBuilder setPropertyValueCombinationPolicy(PropertyValueCombinationPolicy propertyValueCombinationPolicy){
-        contextBuilder.setPropertyValueCombinationPolicy(propertyValueCombinationPolicy);
-        return this;
-    }
-
-    /**
-     * Adds a property converter for the a given type to the configuration to
-     * be build.
-     *
-     * <pre>{@code PropertyConverter<MyType> converter = value -> new MyType(value, 42);
-     *
-     * builder.addPropertyConverter(MyType.class, converter}
-     * </pre>
-     *
-     * @param <T> the type of the configuration
-     * @param type the required target type the converter should be applied to
-     * @param converter the converter to be used to convert the string property
-     *                  to the given target type.
-     *
-     * @return the builder instance currently used
-     *
-     * @see PropertyConverter
-     * @see #enableProvidedPropertyConverters()
-     * @see #disableProvidedPropertyConverters()
-     */
-    public <T> ConfigurationBuilder addPropertyConverter(Class<T> type, PropertyConverter<T> converter) {
-        Objects.requireNonNull(type);
-        Objects.requireNonNull(converter);
-        return addPropertyConverter(TypeLiteral.of(type), (PropertyConverter<Object>)converter);
-    }
-
-    /**
-     * Adds a propertyConverter of a given type.
-     *  
-     * @param <T> the type of the configuration
-     * @param type type literal of this converter.
-     * @param propertyConverter property converter.
-     * @return the builder instance currently used
-     */
-    public <T> ConfigurationBuilder addPropertyConverter(TypeLiteral<T> type, PropertyConverter<T> propertyConverter){
-        Objects.requireNonNull(type);
-        Objects.requireNonNull(propertyConverter);
-        contextBuilder.addPropertyConverter(type, propertyConverter);
-        return this;
-    }
-
-    /**
-     * Checks if the automatic loading of all {@link PropertyConverter
-     * PropertyConverter} service providers is enabled or disabled.
-     *
-     * @return {@code true} if the automatic loading is enabled,
-     *         otherwise {@code false}.
-     *
-     * @see #enableProvidedPropertyConverters()
-     * @see #disableProvidedPropertyConverters()
-     * @see #addPropertyConverter(Class, PropertyConverter)
-     * @see #addPropertyConverter(org.apache.tamaya.TypeLiteral, PropertyConverter)
-     */
-    public boolean isPropertyConverterLoadingEnabled() {
-        return loadProvidedPropertyConverters;
-    }
-
-    /**
-     * Enables the loading of all {@link PropertyConverter}
-     * service providers.
-     *
-     * @return the builder instance currently used
-     *
-     * @see PropertyConverter
-     * @see #disableProvidedPropertyConverters()
-     * @see #enableProvidedPropertyConverters()
-     */
-    public ConfigurationBuilder enableProvidedPropertyConverters() {
-        checkBuilderState();
-
-        loadProvidedPropertyConverters = true;
-
-        return this;
-    }
-
-    /**
-     * Disables the automatic loading of all {@link PropertyConverter}
-     * service providers.
-     *
-     * @return the builder instance currently used
-     *
-     * @see PropertyConverter
-     * @see #enableProvidedPropertyConverters()
-     * @see #addPropertyConverter(Class, PropertyConverter)
-     */
-    public ConfigurationBuilder disableProvidedPropertyConverters() {
-        checkBuilderState();
-
-        loadProvidedPropertyConverters = false;
-
-        return this;
-    }
-
-
-    /**
-     * Enables the automatic loading of all {@link PropertySource}
-     * service providers.
-     *
-     * @return the builder instance currently used
-     *
-     * @see PropertySource
-     * @see #disableProvidedPropertySources()
-     */
-    public ConfigurationBuilder enableProvidedPropertySources() {
-        checkBuilderState();
-
-        loadProvidedPropertySources = true;
-
-        return this;
-    }
-
-    /**
-     * Checks if the automatic loading of all {@link PropertySource
-     * PropertySource} service providers is enabled or disabled.
-     *
-     * @return {@code true} if the automatic loading is enabled,
-     *         otherwise {@code false}.
-     */
-    public boolean isPropertySourcesLoadingEnabled() {
-        return loadProvidedPropertySources;
-    }
-
-
-    /**
-     * Checks if the automatic loading of all {@link PropertyFilter
-     * PropertyFilter} service providers is enabled or disabled.
-     *
-     * @return {@code true} if the automatic loading is enabled,
-     *         otherwise {@code false}.
-     */
-    public boolean isPropertyFilterLoadingEnabled() {
-        return isLoadProvidedPropertyFilters;
-    }
-
-    /**
-     * Enables the automatic loading of all {@link PropertyFilter}
-     * service providers.
-     *
-     * @return the builder instance currently used
-     *
-     * @see PropertyFilter
-     * @see #disableProvidedPropertyFilters()
-     * @see #addPropertyFilters(PropertyFilter...)
-     */
-    public ConfigurationBuilder enabledProvidedPropertyFilters() {
-        checkBuilderState();
-
-        isLoadProvidedPropertyFilters = true;
-
-        return this;
-    }
-
-    /**
-     * Disables the automatic loading of all {@link PropertyFilter}
-     * service providers.
-     *
-     * @see PropertyFilter
-     * @see #enabledProvidedPropertyFilters()
-     * @see #addPropertyFilters(PropertyFilter...)
-     *
-     * @return the builder instance currently used
-     */
-    public ConfigurationBuilder disableProvidedPropertyFilters() {
-        checkBuilderState();
-
-        isLoadProvidedPropertyFilters = false;
-
-        return this;
-    }
-
-    /**
-     * Disables the automatic loading of all {@link PropertySource}
-     * service providers.
-     *
-     * @return the builder instance currently used
-     *
-     * @see PropertySource
-     * @see #enableProvidedPropertySources()
-     */
-    public ConfigurationBuilder disableProvidedPropertySources() {
-        checkBuilderState();
-
-        loadProvidedPropertySources = false;
-
-        return this;
-    }
-
-    /**
-     * Enables the automatic loading of {@link PropertySourceProvider
-     * property source providers} provided via the SPI API.
-     *
-     * @return the builder instance currently used
-     *
-     * @see PropertySourceProvider
-     */
-    public ConfigurationBuilder enableProvidedPropertySourceProviders() {
-        checkBuilderState();
-
-        loadProvidedPropertySourceProviders = true;
-
-        return this;
-    }
-
-    /**
-     * Disables the automatic loading of {@link PropertySourceProvider
-     * property source providers} provided via the SPI API.
-     *
-     * @return the builder instance currently used
-     */
-    public ConfigurationBuilder disableProvidedPropertySourceProviders() {
-        checkBuilderState();
-
-        loadProvidedPropertySourceProviders = false;
-
-        return this;
-    }
-
-    /**
-     * Checks if the automatic loading of {@link PropertySourceProvider
-     * PropertySourceProviders} is enabled or disabled.
-     *
-     * @return {@code true} if the automatic loading is enabled,
-     *         otherwise {@code false}.
-     */
-    public boolean isPropertySourceProvidersLoadingEnabled() {
-        return loadProvidedPropertySourceProviders;
-    }
-
-    //X TODO think on a functionality/API for using the default PropertyConverters and use the configured ones here
-    //X TODO as overrides used first.
-
-
-    /**
-     * Builds a new configuration based on the configuration of this builder instance.
-     *
-     * @return a new {@link org.apache.tamaya.Configuration configuration instance},
-     *         never {@code null}.
-     */
-    public Configuration build() {
-        checkBuilderState();
-
-        built = true;
-
-        contextBuilder.loadProvidedPropertyConverters(isPropertyConverterLoadingEnabled());
-        contextBuilder.loadProvidedPropertySources(isPropertySourcesLoadingEnabled());
-        contextBuilder.loadProvidedPropertySourceProviders(isPropertySourceProvidersLoadingEnabled());
-        contextBuilder.loadProvidedPropertyFilters(isLoadProvidedPropertyFilters);
-
-        return new DefaultConfiguration(contextBuilder.build());
-    }
-
-    /**
-     * Mapper to map a URL given as string to an URL instance.
-     */
-    private static class StringToURLMapper {
-        public URL apply(String u) {
-            try {
-                return new URL(u);
-            } catch (MalformedURLException e) {
-                throw new ConfigException(u + " is not a valid URL", e);
-            }
-        }
-    }
-}
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultConfigurationContext.java b/modules/builder/src/main/java/org/apache/tamaya/builder/DefaultPropertySourceBasedConfiguration.java
similarity index 78%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultConfigurationContext.java
rename to modules/builder/src/main/java/org/apache/tamaya/builder/DefaultPropertySourceBasedConfiguration.java
index cab4a49..a459a4c 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultConfigurationContext.java
+++ b/modules/builder/src/main/java/org/apache/tamaya/builder/DefaultPropertySourceBasedConfiguration.java
@@ -16,18 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.internal;
+package org.apache.tamaya.builder;
 
-import org.apache.tamaya.ConfigurationProvider;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.builder.spi.ConfigurationContext;
-import org.apache.tamaya.builder.spi.ConfigurationContextBuilder;
-import org.apache.tamaya.builder.spi.PropertyConverter;
+import org.apache.tamaya.builder.internal.PropertyFiltering;
 import org.apache.tamaya.builder.spi.PropertyFilter;
 import org.apache.tamaya.builder.spi.PropertySource;
 import org.apache.tamaya.builder.spi.PropertySourceProvider;
 import org.apache.tamaya.builder.spi.PropertyValueCombinationPolicy;
-import org.apache.tamaya.builder.spi.ServiceContextManager;
+import org.apache.tamaya.servicecontext.ServiceContextManager;
 
 import javax.annotation.Priority;
 import java.io.Serializable;
@@ -36,22 +32,20 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
  * Default Implementation of a simple ConfigurationContext.
  */
-public class DefaultConfigurationContext implements ConfigurationContext {
+class DefaultPropertySourceBasedConfiguration implements PropertySourceBasedConfiguration {
     /** The logger used. */
-    private final static Logger LOG = Logger.getLogger(DefaultConfigurationContext.class.getName());
-    /**
-     * Cubcomponent handling {@link PropertyConverter} instances.
-     */
-    private final PropertyConverterManager propertyConverterManager = new PropertyConverterManager();
+    private final static Logger LOG = Logger.getLogger(DefaultPropertySourceBasedConfiguration.class.getName());
 
     /**
      * The current unmodifiable list of loaded {@link PropertySource} instances.
@@ -86,7 +80,7 @@
      * all our {@link PropertySource}s and
      * {@link PropertyFilter}s which are known at startup.
      */
-    public DefaultConfigurationContext() {
+    public DefaultPropertySourceBasedConfiguration() {
         List<PropertySource> propertySources = new ArrayList<>();
 
         // first we load all PropertySources which got registered via java.util.ServiceLoader
@@ -120,7 +114,7 @@
         LOG.info("Using PropertyValueCombinationPolicy: " + propertyValueCombinationPolicy);
     }
 
-    DefaultConfigurationContext(DefaultConfigurationContextBuilder builder) {
+    DefaultPropertySourceBasedConfiguration(PropertySourceBasedConfigurationBuilder builder) {
         List<PropertySource> propertySources = new ArrayList<>();
         // first we load all PropertySources which got registered via java.util.ServiceLoader
         propertySources.addAll(builder.propertySources.values());
@@ -148,6 +142,55 @@
         LOG.info("Using PropertyValueCombinationPolicy: " + propertyValueCombinationPolicy);
     }
 
+    @Override
+    public String get(String key) {
+        Map<String,String> value = evaluteRawValue(key);
+        if(value==null || value.get(key)==null){
+            return null;
+        }
+        return PropertyFiltering.applyFilter(key, value, this);
+    }
+
+    /**
+     * Get the current properties, composed by the loaded {@link PropertySource} and filtered
+     * by registered {@link PropertyFilter}.
+     *
+     * @return the final properties.
+     */
+    @Override
+    public Map<String, String> getProperties() {
+        return PropertyFiltering.applyFilters(evaluateUnfilteredMap(), this);
+    }
+
+    protected Map<String, String> evaluateUnfilteredMap() {
+        List<PropertySource> propertySources = new ArrayList<>(getPropertySources());
+        Collections.reverse(propertySources);
+        Map<String, String> result = new HashMap<>();
+        for (PropertySource propertySource : propertySources) {
+            try {
+                int origSize = result.size();
+                Map<String, String> otherMap = propertySource.getProperties();
+                LOG.log(Level.FINEST, null, "Overriding with properties from " + propertySource.getName());
+                result.putAll(otherMap);
+                LOG.log(Level.FINEST, null, "Handled properties from " + propertySource.getName() + "(new: " +
+                        (result.size() - origSize) + ", overrides: " + origSize + ", total: " + result.size());
+            } catch (Exception e) {
+                LOG.log(Level.SEVERE, "Error adding properties from PropertySource: " + propertySource + ", ignoring PropertySource.", e);
+            }
+        }
+        return result;
+    }
+
+    protected Map<String,String> evaluteRawValue(String key) {
+        List<PropertySource> propertySources = getPropertySources();
+        Map<String,String> unfilteredValue = null;
+        PropertyValueCombinationPolicy combinationPolicy = getPropertyValueCombinationPolicy();
+        for (PropertySource propertySource : propertySources) {
+            unfilteredValue = combinationPolicy.collect(unfilteredValue, key, propertySource);
+        }
+        return unfilteredValue;
+    }
+
     /**
      * Pick up all {@link PropertySourceProvider}s and return all the
      * {@link PropertySource}s they like to register.
@@ -245,22 +288,6 @@
     }
 
     @Override
-    public <T> void addPropertyConverter(TypeLiteral<T> typeToConvert, PropertyConverter<T> propertyConverter) {
-        propertyConverterManager.register(typeToConvert, propertyConverter);
-        LOG.info("Added PropertyConverter: " + propertyConverter.getClass().getName());
-    }
-
-    @Override
-    public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() {
-        return propertyConverterManager.getPropertyConverters();
-    }
-
-    @Override
-    public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> targetType) {
-        return propertyConverterManager.getPropertyConverters(targetType);
-    }
-
-    @Override
     public List<PropertyFilter> getPropertyFilters() {
         return immutablePropertyFilters;
     }
@@ -271,8 +298,9 @@
     }
 
     @Override
-    public ConfigurationContextBuilder toBuilder() {
-        return ConfigurationProvider.getConfigurationContextBuilder().setContext(this);
+    public PropertySourceBasedConfigurationBuilder toBuilder() {
+        return new PropertySourceBasedConfigurationBuilder()
+                .setConfiguration(this);
     }
 
 }
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java b/modules/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java
deleted file mode 100644
index 05acdc3..0000000
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/ProgrammaticConfigurationContext.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.builder;
-
-
-import org.apache.tamaya.builder.spi.PropertyConverter;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.builder.spi.ConfigurationContext;
-import org.apache.tamaya.builder.spi.ConfigurationContextBuilder;
-import org.apache.tamaya.builder.spi.PropertyFilter;
-import org.apache.tamaya.builder.spi.PropertySource;
-import org.apache.tamaya.builder.spi.PropertySourceProvider;
-import org.apache.tamaya.builder.spi.PropertyValueCombinationPolicy;
-import org.apache.tamaya.builder.spi.ServiceContextManager;
-import org.apache.tamaya.spisupport.PriorityServiceComparator;
-import org.apache.tamaya.spisupport.PropertyConverterManager;
-import org.apache.tamaya.spisupport.PropertySourceComparator;
-
-import javax.annotation.Priority;
-import java.util.*;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-import java.util.logging.Logger;
-
-/**
- * Implementation of the {@link ConfigurationContext}
- * used by the {@link org.apache.tamaya.builder.ConfigurationBuilder}
- * internally.
- */
-class ProgrammaticConfigurationContext implements ConfigurationContext {
-
-    private static final Comparator<PropertySource> PS_COMPARATOR = new PropertySourceComparator();
-    private static final Comparator<Object> COMP_COMPARATOR = new PriorityServiceComparator();
-    /**
-     * The logger used.
-     */
-    private final static Logger LOG = Logger.getLogger(ProgrammaticConfigurationContext.class.getName());
-    /**
-     * Cubcomponent handling {@link PropertyConverter} instances.
-     */
-    private PropertyConverterManager propertyConverterManager = new PropertyConverterManager();
-
-    /**
-     * The current unmodifiable list of loaded {@link PropertySource} instances.
-     */
-    private List<PropertySource> immutablePropertySources = new ArrayList<>();
-
-    /**
-     * The current unmodifiable list of loaded {@link PropertyFilter} instances.
-     */
-    private List<PropertyFilter> immutablePropertyFilters = new ArrayList<>();
-
-    /**
-     * The overriding policy used when combining PropertySources registered to evalute the final configuration
-     * values.
-     */
-    private PropertyValueCombinationPolicy propertyValueCombinationPolicy;
-
-    /**
-     * Lock for internal synchronization.
-     */
-    private final ReadWriteLock propertySourceLock = new ReentrantReadWriteLock();
-
-
-    /**
-     * The first time the Configuration system gets invoked we do initialize
-     * all our {@link PropertySource}s and
-     * {@link PropertyFilter}s which are known at startup.
-     */
-    @SuppressWarnings("unchecked")
-    public ProgrammaticConfigurationContext(Builder builder) {
-        propertyConverterManager = new PropertyConverterManager(builder.loadProvidedPropertyConverters);
-
-        List<PropertySource> sources = getAllPropertySources(builder);
-        Collections.sort(sources, PS_COMPARATOR);
-        immutablePropertySources = Collections.unmodifiableList(sources);
-
-
-        List<PropertyFilter> filters = getPropertyFilters(builder);
-        Collections.sort(filters, COMP_COMPARATOR);
-        immutablePropertyFilters = Collections.unmodifiableList(filters);
-
-
-        propertyValueCombinationPolicy = builder.propertyValueCombinationPolicy;
-        for(Map.Entry<TypeLiteral<?>, List<PropertyConverter<?>>> en: builder.propertyConverters.entrySet()){
-            if(en!=null){
-                for(PropertyConverter pv:en.getValue()) {
-                    propertyConverterManager.register(en.getKey(), pv);
-                }
-            }
-        }
-
-        LOG.info("Using " + immutablePropertySources.size() + " property sources: " + immutablePropertySources);
-        LOG.info("Using " + immutablePropertyFilters.size() + " property filters: " + immutablePropertyFilters);
-        LOG.info("Using PropertyValueCombinationPolicy: " + propertyValueCombinationPolicy);
-    }
-
-    private List<PropertyFilter> getPropertyFilters(Builder builder) {
-        List<PropertyFilter> provided = new ArrayList<>();
-        if(builder.loadProvidedPropertyFilters) {
-            provided.addAll(ServiceContextManager.getServiceContext().getServices(PropertyFilter.class));
-        }
-        for(PropertyFilter pf:builder.propertyFilters) {
-            if (pf != null) {
-                provided.add(pf);
-            }
-        }
-        return provided;
-    }
-
-    private List<PropertySource> getAllPropertySources(Builder builder) {
-        List<PropertySource> provided = new ArrayList<>();
-        if(builder.loadProvidedPropertySources) {
-            provided.addAll(ServiceContextManager.getServiceContext().getServices(PropertySource.class));
-        }
-        for(PropertySource ps:builder.propertySources){
-            if(ps!=null){
-                provided.add(ps);
-            }
-        }
-        if (builder.loadProvidedPropertySourceProviders) {
-            List<PropertySourceProvider> providers = ServiceContextManager.getServiceContext()
-                                                                  .getServices(PropertySourceProvider.class);
-            for (PropertySourceProvider provider : providers) {
-                for(PropertySource ps:provider.getPropertySources()) {
-                    if(ps!=null) {
-                        provided.addAll(provider.getPropertySources());
-                    }
-                }
-            }
-        }
-        return provided;
-    }
-
-    public void addPropertySources(PropertySource... propertySourcesToAdd) {
-        Lock writeLock = propertySourceLock.writeLock();
-        try {
-            writeLock.lock();
-            List<PropertySource> provided = new ArrayList<>();
-            for(PropertySource ps:propertySourcesToAdd){
-                if(ps!=null){
-                    provided.add(ps);
-                }
-            }
-            this.immutablePropertySources = Collections.unmodifiableList(provided);
-        } finally {
-            writeLock.unlock();
-        }
-    }
-
-    /**
-     * Order property source reversely, the most important come first.
-     *
-     * @param source1 the first PropertySource
-     * @param source2 the second PropertySource
-     * @return the comparison result.
-     */
-    private int comparePropertySources(PropertySource source1, PropertySource source2) {
-
-        //X TODO this method duplicates DefaultConfigurationContext.PropertySourceComparator.comparePropertySources()
-        //X maybe we should extract the Comperator in an own class for real code-reuse (copy paste == bad code reuse)
-
-        if (source1.getOrdinal() < source2.getOrdinal()) {
-            return -1;
-        } else if (source1.getOrdinal() > source2.getOrdinal()) {
-            return 1;
-        } else {
-            return source1.getClass().getName().compareTo(source2.getClass().getName());
-        }
-    }
-
-    /**
-     * Compare 2 filters for ordering the filter chain.
-     *
-     * @param filter1 the first filter
-     * @param filter2 the second filter
-     * @return the comparison result
-     */
-    private int comparePropertyFilters(PropertyFilter filter1, PropertyFilter filter2) {
-
-        //X TODO this method duplicates DefaultConfigurationContext.PropertySourceComparator.comparePropertyFilters()
-        //X maybe we should extract the Comperator in an own class for real code-reuse (copy paste == bad code reuse)
-
-        Priority prio1 = filter1.getClass().getAnnotation(Priority.class);
-        Priority prio2 = filter2.getClass().getAnnotation(Priority.class);
-        int ord1 = prio1 != null ? prio1.value() : 0;
-        int ord2 = prio2 != null ? prio2.value() : 0;
-
-        if (ord1 < ord2) {
-            return -1;
-        } else if (ord1 > ord2) {
-            return 1;
-        } else {
-            return filter1.getClass().getName().compareTo(filter2.getClass().getName());
-        }
-    }
-
-    @Override
-    public List<PropertySource> getPropertySources() {
-        return immutablePropertySources;
-    }
-
-    public <T> void addPropertyConverter(TypeLiteral<T> typeToConvert, PropertyConverter<T> propertyConverter) {
-        propertyConverterManager.register(typeToConvert, propertyConverter);
-        LOG.info("Added PropertyConverter: " + propertyConverter.getClass().getName());
-    }
-
-    @Override
-    public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() {
-        return propertyConverterManager.getPropertyConverters();
-    }
-
-    @Override
-    public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> targetType) {
-        return propertyConverterManager.getPropertyConverters(targetType);
-    }
-
-    @Override
-    public List<PropertyFilter> getPropertyFilters() {
-        return immutablePropertyFilters;
-    }
-
-    @Override
-    public PropertyValueCombinationPolicy getPropertyValueCombinationPolicy() {
-        return propertyValueCombinationPolicy;
-    }
-
-
-    @Override
-    public ConfigurationContextBuilder toBuilder() {
-        // @todo Check if it could be useful to support this method, Oliver B. Fischer
-        throw new RuntimeException("This method is currently not supported.");
-    }
-
-    /**
-     * The Builder for {@link ProgrammaticConfigurationContext}
-     */
-    public final static class Builder {
-        /**
-         * The current unmodifiable list of loaded {@link PropertySource} instances.
-         */
-        private final List<PropertySource> propertySources = new ArrayList<>();
-
-        /**
-         * The current unmodifiable list of loaded {@link PropertyFilter} instances.
-         */
-        private final List<PropertyFilter> propertyFilters = new ArrayList<>();
-
-        private final Map<TypeLiteral<?>, List<PropertyConverter<?>>> propertyConverters = new HashMap<>();
-
-        /**
-         * The overriding policy used when combining PropertySources registered to evalute the final configuration
-         * values.
-         */
-        private PropertyValueCombinationPolicy propertyValueCombinationPolicy =
-                PropertyValueCombinationPolicy.DEFAULT_OVERRIDING_COLLECTOR;
-
-        private boolean loadProvidedPropertyConverters;
-        private boolean loadProvidedPropertySources;
-        private boolean loadProvidedPropertySourceProviders;
-        private boolean loadProvidedPropertyFilters;
-
-        public Builder setPropertyValueCombinationPolicy(PropertyValueCombinationPolicy policy) {
-            this.propertyValueCombinationPolicy = Objects.requireNonNull(policy);
-            return this;
-        }
-
-        public Builder addPropertySources(PropertySource... propertySources) {
-            for (PropertySource ps : propertySources) {
-                if (ps != null) {
-                    this.propertySources.add(ps);
-                }
-            }
-            return this;
-        }
-
-        public Builder addPropertySources(Collection<PropertySource> propertySources) {
-            for (PropertySource ps : propertySources) {
-                if (ps != null) {
-                    this.propertySources.add(ps);
-                }
-            }
-            return this;
-        }
-
-        public Builder addPropertySourceProviders(PropertySourceProvider... propertySourceProviders) {
-            for (PropertySourceProvider ps : propertySourceProviders) {
-                if (ps != null) {
-                    this.propertySources.addAll(ps.getPropertySources());
-                }
-            }
-            return this;
-        }
-
-        public Builder addPropertySourceProviders(Collection<PropertySourceProvider> propertySourceProviders) {
-            for (PropertySourceProvider ps : propertySourceProviders) {
-                if (ps != null) {
-                    this.propertySources.addAll(ps.getPropertySources());
-                }
-            }
-            return this;
-        }
-
-        public Builder addPropertyFilters(PropertyFilter... propertyFIlter) {
-            for (PropertyFilter pf : propertyFIlter) {
-                if (pf != null) {
-                    this.propertyFilters.add(pf);
-                }
-            }
-            return this;
-        }
-
-        public Builder addPropertyFilters(Collection<PropertyFilter> propertyFIlter) {
-            for (PropertyFilter pf : propertyFIlter) {
-                if (pf != null) {
-                    this.propertyFilters.add(pf);
-                }
-            }
-            return this;
-        }
-
-        /**
-         * Should be never used.
-         */
-        @Deprecated
-        public Builder setConfigurationContext(ConfigurationContext configurationContext) {
-            this.addPropertySources(configurationContext.getPropertySources());
-            this.addPropertyFilters(configurationContext.getPropertyFilters());
-            this.propertyValueCombinationPolicy = Objects.requireNonNull(
-                    configurationContext.getPropertyValueCombinationPolicy());
-            return this;
-        }
-
-        //X TODO think on a functonality/API for using the default PropertyConverters and use the configured ones here
-        //X TODO as overrides used first.
-
-        public <T> Builder addPropertyConverter(TypeLiteral<T> type, PropertyConverter<T> propertyConverter) {
-            if(!propertyConverters.containsKey(type)){
-                List<PropertyConverter<?>> convList = new ArrayList<>();
-                convList.add(propertyConverter);
-                propertyConverters.put(type, convList);
-            }
-            return this;
-        }
-
-        public ConfigurationContext build() {
-            return new ProgrammaticConfigurationContext(this);
-        }
-
-
-        public void loadProvidedPropertyConverters(boolean state) {
-            loadProvidedPropertyConverters = state;
-        }
-
-        public void loadProvidedPropertySources(boolean state) {
-            loadProvidedPropertySources = state;
-        }
-
-        public void loadProvidedPropertySourceProviders(boolean state) {
-            loadProvidedPropertySourceProviders = state;
-        }
-
-        public void loadProvidedPropertyFilters(boolean state) {
-            loadProvidedPropertyFilters = state;
-        }
-
-    }
-
-
-
-}
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBasedConfiguration.java b/modules/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBasedConfiguration.java
new file mode 100644
index 0000000..376966c
--- /dev/null
+++ b/modules/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBasedConfiguration.java
@@ -0,0 +1,76 @@
+/*
+ * 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.tamaya.builder;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.builder.spi.PropertyFilter;
+import org.apache.tamaya.builder.spi.PropertySource;
+import org.apache.tamaya.builder.spi.PropertyValueCombinationPolicy;
+
+import java.util.List;
+
+/**
+ * Central SPI for programmatically dealing with the setup of the configuration system.
+ * This includes adding and enlisting {@link PropertySource}s,
+ * ConfigFilters, etc.
+ */
+public interface PropertySourceBasedConfiguration extends Configuration {
+
+    /**
+     * This method can be used for programmatically adding {@link PropertySource}s.
+     * It is not needed for normal 'usage' by end users, but only for Extension Developers!
+     *
+     * @param propertySourcesToAdd the PropertySources to add
+     */
+    void addPropertySources(PropertySource... propertySourcesToAdd);
+
+    /**
+     * This method returns the current list of registered PropertySources ordered via their ordinal.
+     * PropertySources with a lower ordinal come last. The PropertySource with the
+     * highest ordinal comes first.
+     * If two PropertySources have the same ordinal number they will get sorted
+     * using their class name just to ensure the user at least gets the same ordering
+     * after a JVM restart, hereby names before are added last.
+     * PropertySources are loaded when this method is called the first time, which basically is
+     * when the first time configuration is accessed.
+     *
+     * @return a sorted list of registered PropertySources.  The returned list need not be modifiable
+     */
+    List<PropertySource> getPropertySources();
+
+    /**
+     * Access the current PropertyFilter instances.
+     * @return the list of registered PropertyFilters, never null.
+     */
+    List<PropertyFilter> getPropertyFilters();
+
+    /**
+     * Access the {@link PropertyValueCombinationPolicy} used to evaluate the final
+     * property values.
+     * @return the {@link PropertyValueCombinationPolicy} used, never null.
+     */
+    PropertyValueCombinationPolicy getPropertyValueCombinationPolicy();
+
+    /**
+     * Creates a {@link PropertySourceBasedConfigurationBuilder} preinitialized with the data from this instance.
+     * @return a new builder instance, never null.
+     */
+    PropertySourceBasedConfigurationBuilder toBuilder();
+
+}
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBasedConfigurationBuilder.java b/modules/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBasedConfigurationBuilder.java
new file mode 100644
index 0000000..c7dd922
--- /dev/null
+++ b/modules/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBasedConfigurationBuilder.java
@@ -0,0 +1,483 @@
+/*
+ * 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.tamaya.builder;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.builder.propertysource.SimplePropertySource;
+import org.apache.tamaya.builder.spi.*;
+import org.apache.tamaya.format.ConfigurationData;
+import org.apache.tamaya.format.ConfigurationFormats;
+import org.apache.tamaya.format.FlattenedDefaultPropertySource;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import static java.lang.String.format;
+
+/**
+ * <p>Builder class used for building a configuration manually without relying
+ * only on the Service Provider Interface API.</p>
+ *
+ * <p><strong>Features of the builder</strong></p>
+ *
+ * <ol>
+ *   <li>Adding of property converters manually</li>
+ *   <li>Adding of property sources directly</li>
+ *   <li>Adding of property sources via URL</li>
+ *   <li>Adding of property source providers directly</li>
+ *   <li>Enabling and disabling of via SPI mechanism provided resources as converters,
+ *       property sources, etc.</li>
+ * </ol>
+ *
+ * <p><strong>Example</strong></p>
+ *
+ * <pre>{@code ConfigurationBuilder builder = new ConfigurationBuilder();
+ * builder.disableProvidedPropertySources()           // Do not load provided property
+ *        .disableProvidedPropertySourceProviders()   // sources and providers automatically
+ *        .addPropertySource("file:/etc/conf.properties"); // Load properties from conf.properties
+ *
+ * Configuration config = builder.build();
+ * }</pre>
+ *
+ * <p><strong>Support for configuration formats</strong></p>
+ *
+ * The configuration builder allows you to put property resources
+ * via a URL, as shown in the code example above, without implementing
+ * a {@link PropertySource PropertySource} or providing an
+ * instance of a {@link PropertySource PropertySource}.
+ * If a property resource in
+ * a specific format can be added to configuration builder or not depends
+ * on the available implementations of
+ * {@link org.apache.tamaya.format.ConfigurationFormat} in the classpath.
+ * Which formats are available can be checked via
+ * {@link org.apache.tamaya.format.ConfigurationFormats#getFormats()}.
+ */
+public class PropertySourceBasedConfigurationBuilder {
+    private static final Logger LOG = Logger.getLogger(PropertySourceBasedConfigurationBuilder.class.getName());
+    /**
+     * The current unmodifiable list of loaded {@link PropertySource} instances.
+     */
+    private final List<PropertySource> propertySources = new ArrayList<>();
+
+    /**
+     * The current unmodifiable list of loaded {@link PropertyFilter} instances.
+     */
+    private final List<PropertyFilter> propertyFilters = new ArrayList<>();
+
+    /**
+     * The overriding policy used when combining PropertySources registered to evalute the final configuration
+     * values.
+     */
+    private PropertyValueCombinationPolicy propertyValueCombinationPolicy =
+            PropertyValueCombinationPolicy.DEFAULT_OVERRIDING_COLLECTOR;
+
+    private boolean loadProvidedPropertySources;
+    private boolean loadProvidedPropertySourceProviders;
+    private boolean loadProvidedPropertyFilters;
+
+    /**
+     * Flag if the config has already been built.
+     * Configuration can be built only once
+     */
+    private boolean built;
+
+    public PropertySourceBasedConfigurationBuilder(){
+    }
+
+    public PropertySourceBasedConfigurationBuilder setPropertyValueCombinationPolicy(PropertyValueCombinationPolicy policy) {
+        this.propertyValueCombinationPolicy = Objects.requireNonNull(policy);
+        return this;
+    }
+
+    public PropertySourceBasedConfigurationBuilder addPropertySources(PropertySource... propertySources) {
+        for (PropertySource ps : propertySources) {
+            if (ps != null) {
+                this.propertySources.add(ps);
+            }
+        }
+        return this;
+    }
+
+    public PropertySourceBasedConfigurationBuilder addPropertySources(Collection<PropertySource> propertySources) {
+        for (PropertySource ps : propertySources) {
+            if (ps != null) {
+                this.propertySources.add(ps);
+            }
+        }
+        return this;
+    }
+
+    public PropertySourceBasedConfigurationBuilder addPropertySourceProviders(PropertySourceProvider... propertySourceProviders) {
+        for (PropertySourceProvider ps : propertySourceProviders) {
+            if (ps != null) {
+                this.propertySources.addAll(ps.getPropertySources());
+            }
+        }
+        return this;
+    }
+
+    public PropertySourceBasedConfigurationBuilder addPropertySourceProviders(Collection<PropertySourceProvider> propertySourceProviders) {
+        for (PropertySourceProvider ps : propertySourceProviders) {
+            if (ps != null) {
+                this.propertySources.addAll(ps.getPropertySources());
+            }
+        }
+        return this;
+    }
+
+    public PropertySourceBasedConfigurationBuilder addPropertyFilters(PropertyFilter... propertyFIlter) {
+        for (PropertyFilter pf : propertyFIlter) {
+            if (pf != null) {
+                this.propertyFilters.add(pf);
+            }
+        }
+        return this;
+    }
+
+    public PropertySourceBasedConfigurationBuilder addPropertyFilters(Collection<PropertyFilter> propertyFIlter) {
+        for (PropertyFilter pf : propertyFIlter) {
+            if (pf != null) {
+                this.propertyFilters.add(pf);
+            }
+        }
+        return this;
+    }
+
+    /**
+     * Should be never used.
+     */
+    @Deprecated
+    public PropertySourceBasedConfigurationBuilder usePropertySourceBasedConfiguration(PropertySourceBasedConfiguration configurationContext) {
+        addPropertySources(configurationContext.getPropertySources());
+        addPropertyFilters(configurationContext.getPropertyFilters());
+        this.propertyValueCombinationPolicy = Objects.requireNonNull(
+                configurationContext.getPropertyValueCombinationPolicy());
+        return this;
+    }
+
+    public void loadProvidedPropertySources(boolean state) {
+        loadProvidedPropertySources = state;
+    }
+
+    public void loadProvidedPropertySourceProviders(boolean state) {
+        loadProvidedPropertySourceProviders = state;
+    }
+
+    public void loadProvidedPropertyFilters(boolean state) {
+        loadProvidedPropertyFilters = state;
+    }
+
+    public PropertySourceBasedConfigurationBuilder setConfiguration(PropertySourceBasedConfiguration context) {
+        this.propertySources.clear();
+        for(PropertySource ps:context.getPropertySources()) {
+            addPropertySources(ps);
+        }
+        this.propertyFilters.clear();
+        this.propertyFilters.addAll(context.getPropertyFilters());
+        this.propertyValueCombinationPolicy = context.getPropertyValueCombinationPolicy();
+        return this;
+    }
+
+    public PropertySourceBasedConfigurationBuilder addPropertySourceURLs(Collection<URL> propertySourceURLsToAdd) {
+        for(URL url:propertySourceURLsToAdd){
+            try {
+                ConfigurationData data = ConfigurationFormats.readConfigurationData(url);
+                addPropertySources(new SimplePropertySource(url.toString(),data.getCombinedProperties()));
+            }catch(Exception e){
+                LOG.log(Level.SEVERE, "Failed to load config from: " + url, e);
+            }
+        }
+        for(URL url:propertySourceURLsToAdd) {
+            try {
+                this.propertySources.add(new SimplePropertySource(url.toString(), getConfigurationDataFromURL(url).getCombinedProperties()));
+            } catch (IOException e) {
+                LOG.log(Level.SEVERE, "Error loading config from: " + url, e);
+            }
+        }
+        return this;
+    }
+
+    /**
+     * Adds one resources with properties in an arbitrary format
+     * to the configuration to be build.
+     *
+     * <p>If a specific format is supported depends on the available
+     * {@link org.apache.tamaya.format.ConfigurationFormat} implementations.</p>
+     *
+     * <pre>{@code URL resource = new URL("file:/etc/service/config.json");
+     *
+     * builder.addPropertySources(resource);}
+     * </pre>
+     *
+     * @param url resource with properties for the the configuration to be build.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.format.ConfigurationFormat
+     * @see org.apache.tamaya.format.ConfigurationFormats#getFormats()
+     */
+    public PropertySourceBasedConfigurationBuilder addPropertySource(URL url) {
+        try {
+            ConfigurationData data = getConfigurationDataFromURL(url);
+            addPropertySources(new SimplePropertySource(url.toString(), data.getCombinedProperties()));
+        } catch (IOException e) {
+            throw new ConfigException("Failed to read " + url.toString(), e);
+        }
+        return this;
+    }
+
+    protected ConfigurationData getConfigurationDataFromURL(URL url) throws IOException {
+        ConfigurationData data = ConfigurationFormats.readConfigurationData(url);
+
+        if (null == data) {
+            String mesg = format("No configuration format found which is able " +
+                    "to read properties from %s.", url.toString());
+
+            throw new ConfigException(mesg);
+        }
+
+        return data;
+    }
+
+    public PropertySourceBasedConfigurationBuilder addPropertySourceURLs(URL... propertySourcesToAdd) {
+        return addPropertySourceURLs(Arrays.asList(propertySourcesToAdd));
+    }
+
+    public PropertySourceBasedConfigurationBuilder removePropertySources(Collection<String> propertySourcesToRemove) {
+        for(String key: propertySourcesToRemove){
+            this.propertySources.remove(key);
+        }
+        return this;
+    }
+
+    public PropertySourceBasedConfigurationBuilder removePropertySources(String... propertySourcesToRemove) {
+        return removePropertySources(Arrays.asList(propertySourcesToRemove));
+    }
+
+
+    /**
+     * Adds one or more resources with properties in an arbitrary format
+     * to the configuration to be build.
+     *
+     * <p>If a specific format is supported depends on the available
+     * {@link org.apache.tamaya.format.ConfigurationFormat} implementations.</p>
+     *
+     *<pre>{@code builder.addPropertySources("file:/etc/service/config.json",
+     *                            "file:/etc/defaults/values.properties");}
+     *</pre>
+     *
+     * @param urls list of resources with properties for the configuration to be
+     *             build.
+     *
+     * @return the builder instance currently used
+     *
+     * @see org.apache.tamaya.format.ConfigurationFormat
+     * @see org.apache.tamaya.format.ConfigurationFormats#getFormats()
+     */
+    public PropertySourceBasedConfigurationBuilder addPropertySourceURLs(String... urls) {
+        for(String url:urls) {
+            if (url != null) {
+                try{
+                    addPropertySource(new URL(url));
+                } catch(Exception e){
+                    throw new ConfigException("Invalid URL: " + url);
+                }
+            }
+        }
+        return this;
+    }
+
+
+    /**
+     * Enables the automatic loading of all {@link PropertySource}
+     * service providers.
+     *
+     * @return the builder instance currently used
+     *
+     * @see PropertySource
+     * @see #disableProvidedPropertySources()
+     */
+    public PropertySourceBasedConfigurationBuilder enableProvidedPropertySources() {
+        checkBuilderState();
+
+        loadProvidedPropertySources = true;
+
+        return this;
+    }
+
+    /**
+     * Enables the automatic loading of all {@link PropertySource}
+     * service providers.
+     *
+     * @return the builder instance currently used
+     *
+     * @see PropertySource
+     * @see #enableProvidedPropertySources()
+     */
+    public PropertySourceBasedConfigurationBuilder disableProvidedPropertySources() {
+        checkBuilderState();
+
+        loadProvidedPropertySources = false;
+
+        return this;
+    }
+
+    /**
+     * Checks if the automatic loading of all {@link PropertySource
+     * PropertySource} service providers is enabled or disabled.
+     *
+     * @return {@code true} if the automatic loading is enabled,
+     *         otherwise {@code false}.
+     */
+    public boolean isPropertySourcesLoadingEnabled() {
+        return loadProvidedPropertySources;
+    }
+
+
+    /**
+     * Checks if the automatic loading of all {@link PropertyFilter
+     * PropertyFilter} service providers is enabled or disabled.
+     *
+     * @return {@code true} if the automatic loading is enabled,
+     *         otherwise {@code false}.
+     */
+    public boolean isPropertyFilterLoadingEnabled() {
+        return loadProvidedPropertyFilters;
+    }
+
+    /**
+     * Enables the automatic loading of all {@link PropertyFilter}
+     * service providers.
+     *
+     * @return the builder instance currently used
+     *
+     * @see PropertyFilter
+     * @see #disableProvidedPropertyFilters()
+     * @see #addPropertyFilters(PropertyFilter...)
+     */
+    public PropertySourceBasedConfigurationBuilder enabledProvidedPropertyFilters() {
+        checkBuilderState();
+
+        loadProvidedPropertyFilters = true;
+
+        return this;
+    }
+
+    /**
+     * Disables the automatic loading of all {@link PropertyFilter}
+     * service providers.
+     *
+     * @see PropertyFilter
+     * @see #enabledProvidedPropertyFilters()
+     * @see #addPropertyFilters(PropertyFilter...)
+     *
+     * @return the builder instance currently used
+     */
+    public PropertySourceBasedConfigurationBuilder disableProvidedPropertyFilters() {
+        checkBuilderState();
+
+        loadProvidedPropertyFilters = false;
+
+        return this;
+    }
+
+    private void checkBuilderState() {
+        if (built) {
+            throw new IllegalStateException("Configuration has already been build.");
+        }
+    }
+
+    /**
+     * Adds one or more property source provider instances to the configuration to be build.
+     *
+     * <pre>{@code PropertySourceProvider jc = new JavaConfigurationProvider();
+     *
+     * builder.addPropertySources(jc)};
+     * </pre>
+     *
+     * @return the builder instance currently used
+     *
+     * @see PropertySourceProvider
+     */
+    public PropertySourceBasedConfigurationBuilder enableProvidedPropertySourceProviders() {
+        checkBuilderState();
+
+        loadProvidedPropertySourceProviders = true;
+
+        return this;
+    }
+
+    /**
+     * Disables the automatic loading of {@link PropertySourceProvider
+     * property source providers} provided via the SPI API.
+     *
+     * @return the builder instance currently used
+     */
+    public PropertySourceBasedConfigurationBuilder disableProvidedPropertySourceProviders() {
+        checkBuilderState();
+
+        loadProvidedPropertySourceProviders = false;
+
+        return this;
+    }
+
+    /**
+     * Checks if the automatic loading of {@link PropertySourceProvider
+     * PropertySourceProviders} is enabled or disabled.
+     *
+     * @return {@code true} if the automatic loading is enabled,
+     *         otherwise {@code false}.
+     */
+    public boolean isPropertySourceProvidersLoadingEnabled() {
+        return loadProvidedPropertySourceProviders;
+    }
+
+    /**
+     * Builds a new configuration based on the configuration of this builder instance.
+     *
+     * @return a new {@link org.apache.tamaya.Configuration configuration instance},
+     *         never {@code null}.
+     */
+    public PropertySourceBasedConfiguration build() {
+        checkBuilderState();
+        loadProvidedPropertySources(isPropertySourcesLoadingEnabled());
+        loadProvidedPropertySourceProviders(isPropertySourceProvidersLoadingEnabled());
+        loadProvidedPropertyFilters(isPropertyFilterLoadingEnabled());
+
+        return new DefaultPropertySourceBasedConfiguration(this);
+    }
+
+    /**
+     * Mapper to map a URL given as string to an URL instance.
+     */
+    private static class StringToURLMapper {
+        public URL apply(String u) {
+            try {
+                return new URL(u);
+            } catch (MalformedURLException e) {
+                throw new ConfigException(u + " is not a valid URL", e);
+            }
+        }
+    }
+
+}
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBuilder.java b/modules/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBuilder.java
index e880fb4..5a69231 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBuilder.java
+++ b/modules/builder/src/main/java/org/apache/tamaya/builder/PropertySourceBuilder.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tamaya.builder;
 
+import org.apache.tamaya.builder.propertysource.SimplePropertySource;
 import org.apache.tamaya.builder.spi.PropertySource;
 
 import java.util.HashMap;
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/SimplePropertySource.java b/modules/builder/src/main/java/org/apache/tamaya/builder/SimplePropertySource.java
deleted file mode 100644
index 8218bc8..0000000
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/SimplePropertySource.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.builder;
-
-import org.apache.tamaya.builder.spi.PropertySource;
-import org.apache.tamaya.builder.spi.PropertyValue;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
-* Simple property source implementation using a map.
-*/
-public class SimplePropertySource implements PropertySource {
-    /** The properties. */
-    private final Map<String, String> properties;
-    /** The source's name. */
-    private final String name;
-
-    public SimplePropertySource(String name, Map<String, String> properties){
-        this.properties = new HashMap<>(properties);
-        this.name = Objects.requireNonNull(name);
-    }
-
-    @Override
-    public int getOrdinal(){
-        PropertyValue configuredOrdinal = get(TAMAYA_ORDINAL);
-        if(configuredOrdinal!=null){
-            try{
-                return Integer.parseInt(configuredOrdinal.getValue());
-            } catch(Exception e){
-                Logger.getLogger(getClass().getName()).log(Level.WARNING,
-                        "Configured Ordinal is not an int number: " + configuredOrdinal, e);
-            }
-        }
-        return getDefaultOrdinal();
-    }
-
-    public int getDefaultOrdinal(){
-        return 0;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public PropertyValue get(String key) {
-        return null;
-    }
-
-    @Override
-    public Map<String, String> getProperties() {
-        return this.properties;
-    }
-
-    @Override
-    public boolean isScannable() {
-        return false;
-    }
-
-    @Override
-    public String toString(){
-        return "SimplePropertySource(name="+name+", numProps="+properties.size()+")";
-    }
-}
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultConfigurationContextBuilder.java b/modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultConfigurationContextBuilder.java
deleted file mode 100644
index 56a3379..0000000
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultConfigurationContextBuilder.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.builder.internal;
-
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.builder.spi.PropertyConverter;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.builder.spi.ConfigurationContext;
-import org.apache.tamaya.builder.spi.ConfigurationContextBuilder;
-import org.apache.tamaya.builder.spi.PropertyFilter;
-import org.apache.tamaya.builder.spi.PropertySource;
-import org.apache.tamaya.builder.spi.PropertyValueCombinationPolicy;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * Default implementation of {@link ConfigurationContextBuilder}.
- */
-public class DefaultConfigurationContextBuilder implements ConfigurationContextBuilder {
-
-    final Map<String, PropertySource> propertySources = new HashMap<>();
-    final List<PropertyFilter> propertyFilters = new ArrayList<>();
-    final Map<TypeLiteral<?>, List<PropertyConverter<?>>> propertyConverters = new HashMap<>();
-    PropertyValueCombinationPolicy combinationPolicy;
-
-    public DefaultConfigurationContextBuilder(){
-    }
-
-    @Override
-    public ConfigurationContextBuilder setContext(ConfigurationContext context) {
-        this.propertySources.clear();
-        for(PropertySource ps:context.getPropertySources()) {
-            this.propertySources.put(ps.getName(), ps);
-        }
-        this.propertyFilters.clear();
-        this.propertyFilters.addAll(context.getPropertyFilters());
-        this.propertyConverters.clear();
-        this.propertyConverters.putAll(context.getPropertyConverters());
-        this.combinationPolicy = context.getPropertyValueCombinationPolicy();
-        return this;
-    }
-
-    @Override
-    public ConfigurationContextBuilder addPropertySources(Collection<PropertySource> propertySourcesToAdd) {
-        for(PropertySource ps:propertySourcesToAdd){
-            if(this.propertySources.containsKey(ps.getName())){
-                throw new ConfigException("Duplicate PropertySource: " + ps.getName());
-            }
-        }
-        for(PropertySource ps:propertySourcesToAdd) {
-            this.propertySources.put(ps.getName(), ps);
-        }
-        return this;
-    }
-
-    @Override
-    public ConfigurationContextBuilder addPropertySources(PropertySource... propertySourcesToAdd) {
-        return addPropertySources(Arrays.asList(propertySourcesToAdd));
-    }
-
-    @Override
-    public ConfigurationContextBuilder removePropertySources(Collection<String> propertySourcesToRemove) {
-        for(String key: propertySourcesToRemove){
-            this.propertySources.remove(key);
-        }
-        return this;
-    }
-
-    @Override
-    public ConfigurationContextBuilder removePropertySources(String... propertySourcesToRemove) {
-        return removePropertySources(Arrays.asList(propertySourcesToRemove));
-    }
-
-    @Override
-    public ConfigurationContextBuilder addPropertyFilters(Collection<PropertyFilter> filters) {
-        this.propertyFilters.addAll(filters);
-        return this;
-    }
-
-    @Override
-    public ConfigurationContextBuilder addPropertyFilters(PropertyFilter... filters) {
-        return addPropertyFilters(Arrays.asList(filters));
-    }
-
-    @Override
-    public ConfigurationContextBuilder removePropertyFilters(Collection<PropertyFilter> filters) {
-        this.propertyFilters.removeAll(filters);
-        return this;
-    }
-
-    @Override
-    public ConfigurationContextBuilder removePropertyFilters(PropertyFilter... filters) {
-        return removePropertyFilters(Arrays.asList(filters));
-    }
-
-    @Override
-    public <T> ConfigurationContextBuilder addPropertyConverter(TypeLiteral<T> typeToConvert, PropertyConverter<T> propertyConverter) {
-        List<PropertyConverter<?>> converters = this.propertyConverters.get(typeToConvert);
-        if(converters==null){
-            converters =  new ArrayList<>();
-            this.propertyConverters.put(typeToConvert, converters);
-        }
-        return this;
-    }
-
-    @Override
-    public ConfigurationContextBuilder removePropertyConverters(TypeLiteral<?> typeToConvert, PropertyConverter<?>... converters) {
-        return removePropertyConverters(typeToConvert, Arrays.asList(converters));
-    }
-
-    @Override
-    public ConfigurationContextBuilder removePropertyConverters(TypeLiteral<?> typeToConvert, Collection<PropertyConverter<?>> converters) {
-        List<PropertyConverter<?>> existing = this.propertyConverters.get(typeToConvert);
-        if(existing!=null) {
-            existing.removeAll(converters);
-        }
-        return this;
-    }
-
-    @Override
-    public ConfigurationContextBuilder setPropertyValueCombinationPolicy(PropertyValueCombinationPolicy policy) {
-        this.combinationPolicy = Objects.requireNonNull(policy);
-        return this;
-    }
-
-    @Override
-    public ConfigurationContext build() {
-        return new DefaultConfigurationContext(this);
-    }
-
-}
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultConfigurationProvider.java b/modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultConfigurationProvider.java
deleted file mode 100644
index 254edd1..0000000
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultConfigurationProvider.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.builder.internal;
-
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.builder.spi.*;
-
-/**
- * Implementation of the Configuration API. This class uses the current {@link ConfigurationContext} to evaluate the
- * chain of {@link PropertySource} and {@link PropertyFilter}
- * instance to evaluate the current Configuration.
- */
-public class DefaultConfigurationProvider implements ConfigurationProviderSpi {
-
-    private ConfigurationContext context = new DefaultConfigurationContext();
-    private Configuration config = new DefaultConfiguration(context);
-
-    @Override
-    public Configuration getConfiguration() {
-        return config;
-    }
-
-    @Override
-    public ConfigurationContext getConfigurationContext() {
-        return context;
-    }
-
-    @Override
-    public ConfigurationContextBuilder getConfigurationContextBuilder() {
-        return ServiceContextManager.getServiceContext().getService(ConfigurationContextBuilder.class);
-    }
-
-    @Override
-    public void setConfigurationContext(ConfigurationContext context){
-        // TODO think on a SPI or move event part into API...
-        this.config = new DefaultConfiguration(context);
-        this.context = context;
-    }
-
-
-    @Override
-    public boolean isConfigurationContextSettable() {
-        return true;
-    }
-
-}
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/PropertyFiltering.java b/modules/builder/src/main/java/org/apache/tamaya/builder/internal/PropertyFiltering.java
index 75d7ad7..a97cf77 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/PropertyFiltering.java
+++ b/modules/builder/src/main/java/org/apache/tamaya/builder/internal/PropertyFiltering.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tamaya.builder.internal;
 
-import org.apache.tamaya.builder.spi.ConfigurationContext;
+import org.apache.tamaya.builder.PropertySourceBasedConfiguration;
 import org.apache.tamaya.builder.spi.FilterContext;
 import org.apache.tamaya.builder.spi.PropertyFilter;
 import org.apache.tamaya.builder.spi.PropertySource;
@@ -31,7 +31,7 @@
 import java.util.logging.Logger;
 
 /**
- * Implementation of the Configuration API. This class uses the current {@link ConfigurationContext} to evaluate the
+ * Implementation of the Configuration API. This class uses the current {@link PropertySourceBasedConfiguration} to evaluate the
  * chain of {@link PropertySource} and {@link PropertyFilter}
  * instance to evaluate the current Configuration.
  */
@@ -51,7 +51,7 @@
      */
     private PropertyFiltering(){}
 
-    public static String applyFilter(String key, Map<String,String> configData, ConfigurationContext configurationContext) {
+    public static String applyFilter(String key, Map<String,String> configData, PropertySourceBasedConfiguration configurationContext) {
         // Apply filters to values, prevent values filtered to null!
         String result = configData.get(key);
         for (int i = 0; i < MAX_FILTER_LOOPS; i++) {
@@ -89,7 +89,7 @@
         return result;
     }
 
-    public static Map<String, String> applyFilters(Map<String, String> inputMap, ConfigurationContext configurationContext) {
+    public static Map<String, String> applyFilters(Map<String, String> inputMap, PropertySourceBasedConfiguration configurationContext) {
         Map<String, String> resultMap = new HashMap<>(inputMap);
         // Apply filters to values, prevent values filtered to null!
         Map<String, String> metaData = filterMetadata(inputMap);
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/PropertySourceBasedConfigurationAdapter.java b/modules/builder/src/main/java/org/apache/tamaya/builder/internal/PropertySourceBasedConfigurationAdapter.java
new file mode 100644
index 0000000..d4eecf5
--- /dev/null
+++ b/modules/builder/src/main/java/org/apache/tamaya/builder/internal/PropertySourceBasedConfigurationAdapter.java
@@ -0,0 +1,41 @@
+/*
+ * 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.tamaya.builder.internal;
+
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.adapter.spi.ConfigurationAdapter;
+import org.apache.tamaya.builder.PropertySourceBasedConfiguration;
+
+/**
+ * Created by atsticks on 19.07.16.
+ */
+public class PropertySourceBasedConfigurationAdapter implements ConfigurationAdapter {
+
+    @Override
+    public <T> T adapt(Configuration configuration, Class<T> targetType) {
+        if(PropertySourceBasedConfiguration.class.equals(targetType)){
+            if(configuration instanceof PropertySourceBasedConfiguration){
+                return (T)configuration;
+            }
+            return (T)new DelegatingPropertySourceBasedConfiguration(configuration);
+        }
+        return null;
+    }
+}
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/package-info.java b/modules/builder/src/main/java/org/apache/tamaya/builder/package-info.java
index 24c86a9..f0509d1 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/package-info.java
+++ b/modules/builder/src/main/java/org/apache/tamaya/builder/package-info.java
@@ -17,12 +17,11 @@
  * under the License.
  */
 /**
- * This package provides
- * {@link org.apache.tamaya.builder.ConfigurationBuilder a configuration
- * builder} that allows to build a configuration manually without
- * using exclusively on the Service Provider Interface API of Tamaya.
+ * This package provides an adapter and builder for managing configuration
+ * organized as a well ordered list of {@link org.apache.tamaya.builder.spi.PropertySource}
+ * instances.
  *
- * @see org.apache.tamaya.builder.ConfigurationBuilder
+ * @see org.apache.tamaya.builder.PropertySourceBasedConfigurationBuilder
  * @see org.apache.tamaya.Configuration
  */
 package org.apache.tamaya.builder;
\ No newline at end of file
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConfigurationContext.java b/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConfigurationContext.java
deleted file mode 100644
index c206e98..0000000
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConfigurationContext.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.builder.spi;
-
-
-import org.apache.tamaya.TypeLiteral;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Central SPI for programmatically dealing with the setup of the configuration system.
- * This includes adding and enlisting {@link PropertySource}s,
- * managing {@link PropertyConverter}s, ConfigFilters, etc.
- */
-public interface ConfigurationContext {
-
-    /**
-     * This method can be used for programmatically adding {@link PropertySource}s.
-     * It is not needed for normal 'usage' by end users, but only for Extension Developers!
-     *
-     * @param propertySourcesToAdd the PropertySources to add
-     */
-    void addPropertySources(PropertySource... propertySourcesToAdd);
-
-    /**
-     * This method returns the current list of registered PropertySources ordered via their ordinal.
-     * PropertySources with a lower ordinal come last. The PropertySource with the
-     * highest ordinal comes first.
-     * If two PropertySources have the same ordinal number they will get sorted
-     * using their class name just to ensure the user at least gets the same ordering
-     * after a JVM restart, hereby names before are added last.
-     * PropertySources are loaded when this method is called the first time, which basically is
-     * when the first time configuration is accessed.
-     *
-     * @return a sorted list of registered PropertySources.  The returned list need not be modifiable
-     */
-    List<PropertySource> getPropertySources();
-
-
-    /**
-     * This method can be used for programmatically adding {@link PropertyConverter}s.
-     * It is not needed for normal 'usage' by end users, but only for Extension Developers!
-     *
-     * @param <T> the type of the type literal
-     * @param typeToConvert the type which the converter is for
-     * @param propertyConverter the PropertyConverters to add for this type
-     */
-    <T> void addPropertyConverter(TypeLiteral<T> typeToConvert, PropertyConverter<T> propertyConverter);
-
-    /**
-     * <p>
-     * This method returns the Map of registered PropertyConverters
-     * per type.
-     * The List for each type is ordered via their {@link javax.annotation.Priority} and
-     * cladd name.
-     * </p>
-     *
-     * <p>A simplified scenario could be like:</p>
-     * <pre>
-     *  {
-     *      Date.class -&gt; {StandardDateConverter, TimezoneDateConverter, MyCustomDateConverter }
-     *      Boolean.class -&gt; {StandardBooleanConverter, FrenchBooleanConverter}
-     *      Integer.class -&gt; {DynamicDefaultConverter}
-     *  }
-     * </pre>
-     *
-     * @return map with sorted list of registered PropertySources per type.
-     */
-    Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters();
-
-    /**
-     * <p>
-     * This method returns the registered PropertyConverters for a given type.
-     * The List for each type is ordered via their {@link javax.annotation.Priority}.
-     * </p>
-     *
-     * <p>
-     * PropertyConverters with a higher Priority come first. The PropertyConverter with the
-     * lowest Priority comes last.
-     * If two PropertyConverter have the same ordinal number they will get sorted
-     * using their class name just to ensure the user at least gets the same ordering
-     * after a JVM restart.
-     * </p>
-     *
-     * <p>
-     * Additionally if a PropertyProvider is accessed, which is not registered the implementation
-     * should try to figure out, if there could be a default implementation as follows:</p>
-     * <ol>
-     *     <li>Look for static factory methods: {@code of(String), valueOf(String), getInstance(String),
-     *     instanceOf(String), fomr(String)}</li>
-     *     <li>Look for a matching constructor: {@code T(String)}.</li>
-     * </ol>
-     *
-     * <p>
-     * If a correspoding factory method or constructor could be found, a corresponding
-     * PropertyConverter should be created and registered automatically for the given
-     * type.
-     * </p>
-     *
-     * <p> The scenario could be like:</p>
-     *
-     * <pre>
-     *  {
-     *      Date.class -&gt; {MyCustomDateConverter,StandardDateConverter, TimezoneDateConverter}
-     *      Boolean.class -&gt; {StandardBooleanConverter, FrenchBooleanConverter}
-     *      Integer.class -&gt; {DynamicDefaultConverter}
-     *  }
-     * </pre>
-     *
-     * <p>
-     * The converters returned for a type should be used as a chain, whereas the result of the
-     * first converter that is able to convert the configured value, is taken as the chain's result.
-     * No more converters are called after a converter has successfully converted the input into
-     * the required target type.
-     * </p>
-     * 
-     * @param <T> the type of the type literal
-     * @param type type of the desired converter
-     * @return a sorted list of registered PropertySources per type.
-     */
-    <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> type);
-
-    /**
-     * Access the current PropertyFilter instances.
-     * @return the list of registered PropertyFilters, never null.
-     */
-    List<PropertyFilter> getPropertyFilters();
-
-    /**
-     * Access the {@link PropertyValueCombinationPolicy} used to evaluate the final
-     * property values.
-     * @return the {@link PropertyValueCombinationPolicy} used, never null.
-     */
-    PropertyValueCombinationPolicy getPropertyValueCombinationPolicy();
-
-    /**
-     * Creates a {@link ConfigurationContextBuilder} preinitialized with the data from this instance.
-     * @return a new builder instance, never null.
-     */
-    ConfigurationContextBuilder toBuilder();
-
-}
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConfigurationContextBuilder.java b/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConfigurationContextBuilder.java
deleted file mode 100644
index 5dfda4f..0000000
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConfigurationContextBuilder.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.builder.spi;
-
-import org.apache.tamaya.TypeLiteral;
-
-import java.util.Collection;
-
-/**
- * A builder for creating new or adapting instances of {@link ConfigurationContext}.
- * Builders can be obtained in exactly two ways:
- * <ol>
- *     <li>By accessing a preinitialized builder from an existing {@link ConfigurationContext},
- *     by calling {@link ConfigurationContext#toBuilder()}.</li>
- *     <li>By accessing an empty builder instance from
- *     {@link org.apache.tamaya.ConfigurationProvider#getConfigurationContextBuilder()}.</li>
- * </ol>
- * After all changes are applied to a builder a new {@link ConfigurationContext} instance can
- * be created and can be applied by calling
- * {@link org.apache.tamaya.ConfigurationProvider#setConfigurationContext(ConfigurationContext)}.
- * 
- */
-
-/* @todo This is some Javadoc which is outdated. I am not sure if I can deleted it. The author
- *       should take care. Oliver B. Fischer, 2015-12-23
- * Since this method can
- * throw an UnsupportedOperationException, you should check before if changing the current ConfigurationContext
- * programmatically is supported by calling
- * {@link org.apache.tamaya.ConfigurationProvider#is}.
- */
-public interface ConfigurationContextBuilder {
-
-    /**
-     * Init this builder instance with the given {@link ConfigurationContext} instance. This
-     * method will replace any existing data in the current builder with the data contained in the given
-     * {@link ConfigurationContext}.
-     *
-     * @param context the {@link ConfigurationContext} instance to be used, not null.
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder setContext(ConfigurationContext context);
-
-    /**
-     * This method can be used for programmatically adding {@link PropertySource}s.
-     * It is not needed for normal 'usage' by end users, but only for Extension Developers!
-     *
-     * @param propertySourcesToAdd the PropertySources to add
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder addPropertySources(PropertySource... propertySourcesToAdd);
-
-    /**
-     * This method can be used for programmatically adding {@link PropertySource}s.
-     * It is not needed for normal 'usage' by end users, but only for Extension Developers!
-     *
-     * @param propertySourcesToAdd the PropertySources to add
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder addPropertySources(Collection<PropertySource> propertySourcesToAdd);
-
-    /**
-     * This method can be used for programmatically adding {@link PropertySource}s.
-     * It is not needed for normal 'usage' by end users, but only for Extension Developers!
-     *
-     * @param propertySourcesNames the PropertySource names of the sources to remove
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder removePropertySources(String... propertySourcesNames);
-
-    /**
-     * This method can be used for programmatically adding {@link PropertySource}s.
-     * It is not needed for normal 'usage' by end users, but only for Extension Developers!
-     *
-     * @param propertySourcesNames the PropertySource names of the sources to remove
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder removePropertySources(Collection<String> propertySourcesNames);
-
-    /**
-     * Adds the given PropertyFilter instances.
-     *
-     * @param filters the filters to add
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder addPropertyFilters(PropertyFilter... filters);
-
-    /**
-     * Adds the given PropertyFilter instances.
-     *
-     * @param filters the filters to add
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder addPropertyFilters(Collection<PropertyFilter> filters);
-
-    /**
-     * Removes the given PropertyFilter instances.
-     *
-     * @param filters the filters to remove
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder removePropertyFilters(PropertyFilter... filters);
-
-    /**
-     * Removes the given PropertyFilter instances.
-     *
-     * @param filters the filters to remove
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder removePropertyFilters(Collection<PropertyFilter> filters);
-
-    /**
-     * This method can be used for programmatically adding {@link PropertyConverter}s.
-     * It is not needed for normal 'usage' by end users, but only for Extension Developers!
-     *
-     * @param <T> the type of the type literal
-     * @param typeToConvert     the type for which the converter is for
-     * @param propertyConverter the PropertyConverters to add for this type
-     * @return this builder, for chaining, never null.
-     */
-    <T> ConfigurationContextBuilder addPropertyConverter(TypeLiteral<T> typeToConvert,
-                                                         PropertyConverter<T> propertyConverter);
-
-    /**
-     * Removes the given PropertyConverter instances.
-     *
-     * @param typeToConvert the type which the converter is for
-     * @param converters    the converters to remove
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder removePropertyConverters(TypeLiteral<?> typeToConvert,
-                                                         PropertyConverter<?>... converters);
-
-    /**
-     * Removes the given PropertyConverter instances.
-     *
-     * @param typeToConvert the type which the converter is for
-     * @param converters    the converters to remove
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder removePropertyConverters(TypeLiteral<?> typeToConvert,
-                                                         Collection<PropertyConverter<?>> converters);
-
-    /**
-     * Sets the {@link PropertyValueCombinationPolicy} used to evaluate the final
-     * property values.
-     *
-     * @param policy the {@link PropertyValueCombinationPolicy} used, not null
-     * @return this builder, for chaining, never null.
-     */
-    ConfigurationContextBuilder setPropertyValueCombinationPolicy(PropertyValueCombinationPolicy policy);
-
-    /**
-     * Builds a {@link ConfigurationContext} based on the data set.
-     * @return final context with the current builder's properties.
-     */
-    ConfigurationContext build();
-
-}
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConfigurationProviderSpi.java b/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConfigurationProviderSpi.java
deleted file mode 100644
index 2769d0a..0000000
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConfigurationProviderSpi.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tamaya.builder.spi;
-
-import org.apache.tamaya.Configuration;
-
-/**
- * SPI that must be implemented to provide the component that manages all {@link org.apache.tamaya.Configuration}
- * instances in a system. In SE this may be a true singleton containing exact one {@link org.apache.tamaya.Configuration}
- * instance, whereas in Java EE and other more complex environments instances may be returned depending the current
- * runtime context.
- */
-public interface ConfigurationProviderSpi {
-
-    /**
-     * Access the current {@link org.apache.tamaya.Configuration}.
-     *
-     * @return the current {@link org.apache.tamaya.Configuration} instance, never null.
-     */
-    Configuration getConfiguration();
-
-    /**
-     * Get access to the current {@link ConfigurationContext}.
-     *
-     * @return the current {@link ConfigurationContext}, never null.
-     * @deprecated Will be removed in favour of {@link Configuration#getContext()}.
-     */
-    @Deprecated
-    ConfigurationContext getConfigurationContext();
-
-    /**
-     * This method allows to replace the current {@link ConfigurationContext} with a new
-     * instance. This can be used to update the context with a new one, e.g. because some of the configuration
-     * data has changed and must be updated. It is the responsibility of the ConfigurationProvider to trigger
-     * corresponding update event for the current {@link ConfigurationContext} or
-     * {@link org.apache.tamaya.Configuration}.
-     *
-     * @param context the new ConfigurationContext to be applied.
-     * @throws java.lang.UnsupportedOperationException if the current provider is read-only.
-     */
-    void setConfigurationContext(ConfigurationContext context);
-
-    /**
-     * Method that allows to determine if a new {@link ConfigurationContext} can be applied
-     * programmatically.
-     *
-     * @return true, if {@link #setConfigurationContext(ConfigurationContext)} is supported
-     * by the current implementation.
-     * @see #setConfigurationContext(ConfigurationContext)
-     */
-    boolean isConfigurationContextSettable();
-
-    /**
-     * Creates a new {@link ConfigurationContextBuilder} instance.
-     *
-     * @return a new {@link ConfigurationContextBuilder}, never null.
-     */
-    ConfigurationContextBuilder getConfigurationContextBuilder();
-
-}
diff --git a/modules/builder/src/test/java/org/apache/tamaya/builder/ConfigurationBuilderTest.java b/modules/builder/src/test/java/org/apache/tamaya/builder/PropertySourceBasedConfigurationBuilderTest.java
similarity index 72%
rename from modules/builder/src/test/java/org/apache/tamaya/builder/ConfigurationBuilderTest.java
rename to modules/builder/src/test/java/org/apache/tamaya/builder/PropertySourceBasedConfigurationBuilderTest.java
index 54cab63..a47638f 100644
--- a/modules/builder/src/test/java/org/apache/tamaya/builder/ConfigurationBuilderTest.java
+++ b/modules/builder/src/test/java/org/apache/tamaya/builder/PropertySourceBasedConfigurationBuilderTest.java
@@ -20,12 +20,7 @@
 
 import org.apache.tamaya.ConfigException;
 import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
 import org.apache.tamaya.builder.spi.*;
-import org.apache.tamaya.builder.util.types.CustomTypeA;
-import org.apache.tamaya.builder.util.types.CustomTypeB;
-import org.apache.tamaya.builder.util.types.CustomTypeC;
-import org.apache.tamaya.spi.*;
 import org.hamcrest.CoreMatchers;
 import org.hamcrest.Matchers;
 import org.junit.Ignore;
@@ -51,11 +46,11 @@
 import static org.mockito.Mockito.verify;
 
 
-public class ConfigurationBuilderTest {
+public class PropertySourceBasedConfigurationBuilderTest {
 
     @Test
     public void buildCanBuildEmptyConfiguration() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.build();
 
@@ -64,7 +59,7 @@
 
     @Test(expected = IllegalStateException.class)
     public void buildCanBeCalledOnlyOnce() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         builder.build();
         builder.build();
@@ -76,7 +71,7 @@
 
     @Test(expected = NullPointerException.class)
     public void addPropertySourcesDoesNotAcceptNullValue() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         builder.addPropertySources((PropertySource[])null);
     }
@@ -88,7 +83,7 @@
         doReturn("first").when(first).getName();
         doReturn(100).when(first).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder().addPropertySources(first);
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder().addPropertySources(first);
 
         builder.build();
 
@@ -107,7 +102,7 @@
         doReturn(PropertyValue.of("keyOfA","a", "test")).when(source).get("keyOfA");
         doReturn(100).when(source).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder().addPropertySources(source);
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder().addPropertySources(source);
 
         Configuration config = builder.build();
 
@@ -130,7 +125,7 @@
         doReturn(PropertyValue.of("keyOfA","a", "test")).when(sourceTwo).get("keyOfA");
         doReturn(10).when(sourceTwo).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder().addPropertySources(sourceOne)
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder().addPropertySources(sourceOne)
                                                                  .addPropertySources(sourceTwo);
 
         Configuration config = builder.build();
@@ -155,7 +150,7 @@
         doReturn("a").when(sourceTwo).get("keyOfA");
         doReturn(20).when(sourceTwo).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder().addPropertySources(sourceOne)
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder().addPropertySources(sourceOne)
                                                                  .addPropertySources(sourceTwo);
 
         Configuration config = builder.build();
@@ -176,7 +171,7 @@
         doReturn(PropertyValue.of("keyOfA","a", "test")).when(sourceTwo).get("keyOfA");
         doReturn(20).when(sourceTwo).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder().addPropertySources(sourceOne)
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder().addPropertySources(sourceOne)
                                                                  .addPropertySources(sourceTwo);
 
         Configuration config = builder.build();
@@ -200,7 +195,7 @@
         doReturn(PropertyValue.of("keyOfA","a", "test")).when(sourceTwo).get("keyOfA");
         doReturn(20).when(sourceTwo).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder().addPropertySources(sourceOne, sourceTwo);
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder().addPropertySources(sourceOne, sourceTwo);
 
         Configuration config = builder.build();
 
@@ -225,7 +220,7 @@
         doReturn(PropertyValue.of("a","a", "test")).when(sourceTwo).get("a");
         doReturn(30).when(sourceTwo).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder().addPropertySources(sourceOne)
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder().addPropertySources(sourceOne)
                                                                  .addPropertySources(sourceTwo);
 
         Configuration config = builder.build();
@@ -249,7 +244,7 @@
         doReturn(PropertyValue.of("a","a", "test")).when(sourceTwo).get("a");
         doReturn(30).when(sourceTwo).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder().addPropertySources(sourceOne, null, sourceTwo);
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder().addPropertySources(sourceOne, null, sourceTwo);
 
         Configuration config = builder.build();
 
@@ -262,107 +257,107 @@
      * Tests for adding P r o p e r t y C o n v e r t e r
      */
 
-    @Test(expected = NullPointerException.class)
-    public void canNotAddNullPropertyConverter() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
-
-        builder.addPropertyConverter(TypeLiteral.of(CustomTypeA.class), null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void canNotAddNullTypeLiteralButPropertyConverter() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
-        builder.addPropertyConverter((TypeLiteral)null,
-                new PropertyConverter() {
-                    @Override
-                    public CustomTypeA convert(final String prop, ConversionContext context) {
-                        return new CustomTypeA(prop, prop);
-                    }
-                });
-    }
-
-    @Test
-    public void addedPropertyConverterWithTypeLiteralIsUsedByConfiguration() {
-        PropertySource source = mock(PropertySource.class, NOT_MOCKED_ANSWER);
-
-        doReturn("source").when(source).getName();
-        doReturn(PropertyValue.of("key","A", "test")).when(source).get("key");
-        doReturn(100).when(source).getOrdinal();
-
-        ConfigurationBuilder builder = new ConfigurationBuilder();
-
-        builder.addPropertyConverter(TypeLiteral.of(CustomTypeA.class),
-                new PropertyConverter() {
-                    @Override
-                    public CustomTypeA convert(final String prop, ConversionContext context) {
-                        return new CustomTypeA(prop, prop);
-                    }
-                });
-        builder.addPropertySources(source);
-
-        Configuration config = builder.build();
-
-        Object resultRaw = config.get("key", CustomTypeA.class);
-
-        assertThat(resultRaw, CoreMatchers.notNullValue());
-
-        CustomTypeA result = (CustomTypeA)resultRaw;
-
-        assertThat(result.getName(), equalTo("AA"));
-    }
-
-    @Test
-    public void addedPropertyConverterWithClassIsUsedByConfiguration() {
-        PropertySource source = mock(PropertySource.class, NOT_MOCKED_ANSWER);
-
-        doReturn("source").when(source).getName();
-        doReturn(PropertyValue.of("key","A", "test")).when(source).get("key");
-        doReturn(100).when(source).getOrdinal();
-
-        ConfigurationBuilder builder = new ConfigurationBuilder();
-
-        builder.addPropertyConverter(TypeLiteral.of(CustomTypeA.class),
-                new PropertyConverter() {
-                    @Override
-                    public CustomTypeA convert(final String prop, ConversionContext context) {
-                        return new CustomTypeA(prop, prop);
-                    }
-                });
-        builder.addPropertySources(source);
-
-        Configuration config = builder.build();
-
-        Object resultRaw = config.get("key", CustomTypeA.class);
-
-        assertThat(resultRaw, CoreMatchers.notNullValue());
-
-        CustomTypeA result = (CustomTypeA)resultRaw;
-
-        assertThat(result.getName(), equalTo("AA"));
-    }
-
-    @Test
-    public void canGetAndConvertPropertyViaOfMethod() {
-        PropertySource source = mock(PropertySource.class, NOT_MOCKED_ANSWER);
-
-        doReturn("source").when(source).getName();
-        doReturn(PropertyValue.of("key","A", "test")).when(source).get("key");
-        doReturn(100).when(source).getOrdinal();
-
-        ConfigurationBuilder builder = new ConfigurationBuilder();
-
-        builder.addPropertySources(source);
-
-        Configuration config = builder.build();
-
-        Object resultRaw = config.get("key", CustomTypeB.class);
-
-        assertThat(resultRaw, CoreMatchers.notNullValue());
-
-        CustomTypeB result = (CustomTypeB)resultRaw;
-
-        assertThat(result.getName(), equalTo("A"));
-    }
+//       @Test(expected = NullPointerException.class)
+//    public void canNotAddNullPropertyConverter() {
+//        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
+//
+//        builder.addPropertyConverter(TypeLiteral.of(CustomTypeA.class), null);
+//    }
+//
+//    @Test(expected = NullPointerException.class)
+//    public void canNotAddNullTypeLiteralButPropertyConverter() {
+//        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
+//        builder.addPropertyConverter((TypeLiteral)null,
+//                new PropertyConverter() {
+//                    @Override
+//                    public CustomTypeA convert(final String prop, ConversionContext context) {
+//                        return new CustomTypeA(prop, prop);
+//                    }
+//                });
+//    }
+//
+//    @Test
+//    public void addedPropertyConverterWithTypeLiteralIsUsedByConfiguration() {
+//        PropertySource source = mock(PropertySource.class, NOT_MOCKED_ANSWER);
+//
+//        doReturn("source").when(source).getName();
+//        doReturn(PropertyValue.of("key","A", "test")).when(source).get("key");
+//        doReturn(100).when(source).getOrdinal();
+//
+//        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
+//
+//        builder.addPropertyConverter(TypeLiteral.of(CustomTypeA.class),
+//                new PropertyConverter() {
+//                    @Override
+//                    public CustomTypeA convert(final String prop, ConversionContext context) {
+//                        return new CustomTypeA(prop, prop);
+//                    }
+//                });
+//        builder.addPropertySources(source);
+//
+//        Configuration config = builder.build();
+//
+//        Object resultRaw = config.get("key", CustomTypeA.class);
+//
+//        assertThat(resultRaw, CoreMatchers.notNullValue());
+//
+//        CustomTypeA result = (CustomTypeA)resultRaw;
+//
+//        assertThat(result.getName(), equalTo("AA"));
+//    }
+//
+//    @Test
+//    public void addedPropertyConverterWithClassIsUsedByConfiguration() {
+//        PropertySource source = mock(PropertySource.class, NOT_MOCKED_ANSWER);
+//
+//        doReturn("source").when(source).getName();
+//        doReturn(PropertyValue.of("key","A", "test")).when(source).get("key");
+//        doReturn(100).when(source).getOrdinal();
+//
+//        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
+//
+//        builder.addPropertyConverter(TypeLiteral.of(CustomTypeA.class),
+//                new PropertyConverter() {
+//                    @Override
+//                    public CustomTypeA convert(final String prop, ConversionContext context) {
+//                        return new CustomTypeA(prop, prop);
+//                    }
+//                });
+//        builder.addPropertySources(source);
+//
+//        Configuration config = builder.build();
+//
+//        Object resultRaw = config.get("key", CustomTypeA.class);
+//
+//        assertThat(resultRaw, CoreMatchers.notNullValue());
+//
+//        CustomTypeA result = (CustomTypeA)resultRaw;
+//
+//        assertThat(result.getName(), equalTo("AA"));
+//    }
+//
+//    @Test
+//    public void canGetAndConvertPropertyViaOfMethod() {
+//        PropertySource source = mock(PropertySource.class, NOT_MOCKED_ANSWER);
+//
+//        doReturn("source").when(source).getName();
+//        doReturn(PropertyValue.of("key","A", "test")).when(source).get("key");
+//        doReturn(100).when(source).getOrdinal();
+//
+//        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
+//
+//        builder.addPropertySources(source);
+//
+//        Configuration config = builder.build();
+//
+//        Object resultRaw = config.get("key", CustomTypeB.class);
+//
+//        assertThat(resultRaw, CoreMatchers.notNullValue());
+//
+//        CustomTypeB result = (CustomTypeB)resultRaw;
+//
+//        assertThat(result.getName(), equalTo("A"));
+//    }
 
     /*********************************************************************
      * Tests for adding P r o p e r t y F i l t e r
@@ -370,7 +365,7 @@
 
     @Test(expected = NullPointerException.class)
     public void canNotAddNullAsPropertyFilter() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
         builder.addPropertyFilters((PropertyFilter[])null);
     }
 
@@ -381,7 +376,7 @@
         doReturn(PropertyValue.of("key","M", "test")).when(source).get("key");
         doReturn("source").when(source).getName();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.addPropertySources(source)
                                       .addPropertyFilters(new TestANonSPIPropertyFilter())
@@ -400,7 +395,7 @@
         doReturn(PropertyValue.of("key","M", "test")).when(source).get("key");
         doReturn("source").when(source).getName();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.addPropertySources(source)
                                       .addPropertyFilters(new TestANonSPIPropertyFilter())
@@ -421,7 +416,7 @@
         doReturn(PropertyValue.of("key","M", "test")).when(source).get("key");
         doReturn("source").when(source).getName();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.addPropertySources(source)
                                       .addPropertyFilters(new TestANonSPIPropertyFilter(),
@@ -443,7 +438,7 @@
         doReturn(PropertyValue.of("key","M", "test")).when(source).get("key");
         doReturn("source").when(source).getName();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.addPropertySources(source)
                                       .addPropertyFilters((PropertyFilter)null) // The cast is needed!
@@ -463,7 +458,7 @@
         doReturn(PropertyValue.of("key","M", "test")).when(source).get("key");
         doReturn("source").when(source).getName();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.addPropertySources(source)
                                       .addPropertyFilters(new TestANonSPIPropertyFilter(),
@@ -488,7 +483,7 @@
 
         doReturn(asList((PropertySource)null)).when(nullReturning).getPropertySources();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.addPropertySourceProviders(new TestPropertySourceProviderB(),
                                                                   nullReturning,
@@ -505,12 +500,12 @@
 
     @Test(expected = NullPointerException.class)
     public void cannotAddNullAsPropertyProvider() {
-        new ConfigurationBuilder().addPropertySourceProviders((PropertySourceProvider[])null);
+        new PropertySourceBasedConfigurationBuilder().addPropertySourceProviders((PropertySourceProvider[])null);
     }
 
     @Test
     public void canAddMultipleNonSPIPropertySourceProviders() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.addPropertySourceProviders(new TestPropertySourceProviderB(),
                                                                   new TestPropertySourceProvider())
@@ -524,7 +519,7 @@
 
     @Test
     public void canAddMultipleNonSPIPropertySourceProvidersWhileOfOfThemIsNull() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.addPropertySourceProviders(new TestPropertySourceProviderB(), null,
                                                                   new TestPropertySourceProvider())
@@ -549,25 +544,25 @@
      * P r o p e r t y S o u r c e s
      */
 
-    @Test
-    public void enablingOfProvidedPropertySourceServiceProvidersIsOk() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
-
-        builder.disableProvidedPropertyConverters()
-               .enableProvidedPropertyConverters();
-
-        assertThat(builder.isPropertyConverterLoadingEnabled(), is(true));
-    }
-
-    @Test
-    public void disablingOfProvidedPropertySourceServiceProvidersIsOk() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
-
-        builder.enableProvidedPropertyConverters()
-               .disableProvidedPropertyConverters();
-
-        assertThat(builder.isPropertyConverterLoadingEnabled(), is(false));
-    }
+//    @Test
+//    public void enablingOfProvidedPropertySourceServiceProvidersIsOk() {
+//        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
+//
+//        builder.disableProvidedPropertyConverters()
+//               .enableProvidedPropertyConverters();
+//
+//        assertThat(builder.isPropertyConverterLoadingEnabled(), is(true));
+//    }
+//
+//    @Test
+//    public void disablingOfProvidedPropertySourceServiceProvidersIsOk() {
+//        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
+//
+//        builder.enableProvidedPropertyConverters()
+//               .disableProvidedPropertyConverters();
+//
+//        assertThat(builder.isPropertyConverterLoadingEnabled(), is(false));
+//    }
 
     @Test(expected = ConfigException.class)
     public void loadingOrPropertyConvertersCanBeDisabled() {
@@ -577,13 +572,11 @@
         doReturn(PropertyValue.of("key","A", "test")).when(source).get("key");
         doReturn(100).when(source).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder().addPropertySources(source)
-                                                                 .enableProvidedPropertyConverters()
-                                                                 .disableProvidedPropertyConverters();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder().addPropertySources(source);
 
         Configuration config = builder.build();
 
-        config.get("key", CustomTypeC.class);
+        config.get("key");
     }
 
     @Test
@@ -594,16 +587,14 @@
         doReturn(PropertyValue.of("key","A", "test")).when(source).get("key");
         doReturn(100).when(source).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder().addPropertySources(source)
-                                                                 .disableProvidedPropertyConverters()
-                                                                 .enableProvidedPropertyConverters();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder().addPropertySources(source);
 
         Configuration config = builder.build();
 
-        CustomTypeC result = config.get("key", CustomTypeC.class);
+        String result = config.get("key");
 
         assertThat(result, notNullValue());
-        assertThat(result.getValue(), equalTo("A"));
+        assertThat(result, equalTo("A"));
     }
 
     /*********************************************************************
@@ -613,7 +604,7 @@
 
     @Test
     public void enablingOfPropertySourceLoadingIsOk() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         builder.disableProvidedPropertySources()
                .enableProvidedPropertySources();
@@ -623,7 +614,7 @@
 
     @Test
     public void disablingPropertySourceLoadingIsOk() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         builder.enableProvidedPropertySources()
                .disableProvidedPropertySources();
@@ -633,7 +624,7 @@
 
     @Test
     public void loadingOfPropertySourcesCanBeEnabled() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.disableProvidedPropertySources()
                                       .enableProvidedPropertySources()
@@ -646,7 +637,7 @@
 
     @Test
     public void loadingOfPropertySourcesCanBeDisabled() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.enableProvidedPropertySources()
                                       .disableProvidedPropertySources()
@@ -670,7 +661,7 @@
         doReturn(PropertyValue.of("key","A", "test")).when(source).get("key");
         doReturn(100).when(source).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.disableProvidedPropertyFilters()
                                       .enabledProvidedPropertyFilters()
@@ -685,7 +676,7 @@
 
     @Test
     public void disablingOfPropertyFiltersLoadingIsOk() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         builder.enabledProvidedPropertyFilters()
                .disableProvidedPropertyFilters();
@@ -695,7 +686,7 @@
 
     @Test
     public void loadingOfPropertyFiltersCanBeDisabled() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         builder.disableProvidedPropertyFilters()
                .enabledProvidedPropertyFilters();
@@ -711,7 +702,7 @@
         doReturn(PropertyValue.of("key","A", "test")).when(source).get("key");
         doReturn(100).when(source).getOrdinal();
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.enabledProvidedPropertyFilters()
                                       .disableProvidedPropertyFilters()
@@ -731,7 +722,7 @@
 
     @Test
     public void disablingOfPropertySourceProvidersIsOk() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         builder.enableProvidedPropertySourceProviders()
                .disableProvidedPropertySourceProviders()
@@ -743,7 +734,7 @@
     @Test
     public void enablingOfPropertySourceProvidersIsOk() {
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         builder.disableProvidedPropertySourceProviders()
                .enableProvidedPropertySourceProviders()
@@ -754,7 +745,7 @@
 
     @Test
     public void loadingOfPropertySourceProvidersCanBeEnabled() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.disableProvidedPropertySourceProviders()
                                       .enableProvidedPropertySourceProviders()
@@ -767,7 +758,7 @@
 
     @Test
     public void loadingOfPropertySourceProvidersCanBeDisabled() {
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.enableProvidedPropertySourceProviders()
                                       .disableProvidedPropertySourceProviders()
@@ -784,7 +775,7 @@
 
         assertThat(resource, CoreMatchers.notNullValue());
 
-        ConfigurationBuilder builder = mock(ConfigurationBuilder.class, CALLS_REAL_METHODS);
+        PropertySourceBasedConfigurationBuilder builder = mock(PropertySourceBasedConfigurationBuilder.class, CALLS_REAL_METHODS);
 
         doThrow(IOException.class).when(builder).getConfigurationDataFromURL(Mockito.eq(resource));
 
@@ -801,9 +792,9 @@
 
         assertThat(resource, CoreMatchers.notNullValue());
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
-        builder.addPropertySources(resource.toString()).build();
+        builder.addPropertySourceURLs(resource.toString()).build();
     }
 
     @Test
@@ -812,9 +803,9 @@
 
         assertThat(resource, CoreMatchers.notNullValue());
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
-        Configuration config = builder.addPropertySources(resource.toString())
+        Configuration config = builder.addPropertySourceURLs(resource.toString())
                                       .build();
 
         assertThat(config, CoreMatchers.notNullValue());
@@ -832,9 +823,9 @@
         assertThat(second, CoreMatchers.notNullValue());
         assertThat(third, CoreMatchers.notNullValue());
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
-        Configuration config = builder.addPropertySources(first.toString(), second.toString(),
+        PropertySourceBasedConfiguration config = builder.addPropertySourceURLs(first.toString(), second.toString(),
                                                          null, third.toString())
                                       .build();
 
@@ -864,7 +855,7 @@
 
         assertThat(resource, CoreMatchers.notNullValue());
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
         Configuration config = builder.addPropertySource(resource)
                                       .build();
@@ -884,9 +875,9 @@
         assertThat(second, CoreMatchers.notNullValue());
         assertThat(third, CoreMatchers.notNullValue());
 
-        ConfigurationBuilder builder = new ConfigurationBuilder();
+        PropertySourceBasedConfigurationBuilder builder = new PropertySourceBasedConfigurationBuilder();
 
-        Configuration config = builder.addPropertySources(first, second,
+        Configuration config = builder.addPropertySourceURLs(first, second,
                                                          null, third)
                                       .build();
 
diff --git a/modules/builder/src/test/java/org/apache/tamaya/builder/internal/converters/ConverterTestsPropertySource.java b/modules/builder/src/test/java/org/apache/tamaya/builder/internal/converters/ConverterTestsPropertySource.java
index 3f34384..c2fe2d3 100644
--- a/modules/builder/src/test/java/org/apache/tamaya/builder/internal/converters/ConverterTestsPropertySource.java
+++ b/modules/builder/src/test/java/org/apache/tamaya/builder/internal/converters/ConverterTestsPropertySource.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tamaya.core.internal.converters;
 
-import org.apache.tamaya.builder.spi.PropertySource;
-import org.apache.tamaya.builder.spi.PropertyValue;
+import org.apache.tamaya.spi.PropertySource;
+import org.apache.tamaya.spi.PropertyValue;
 
 import java.util.Collections;
 import java.util.Map;
diff --git a/modules/builder/src/test/java/org/apache/tamaya/builder/internal/converters/EnumConverterTest.java b/modules/builder/src/test/java/org/apache/tamaya/builder/internal/converters/EnumConverterTest.java
index 52d643e..9b2c8a7 100644
--- a/modules/builder/src/test/java/org/apache/tamaya/builder/internal/converters/EnumConverterTest.java
+++ b/modules/builder/src/test/java/org/apache/tamaya/builder/internal/converters/EnumConverterTest.java
@@ -19,7 +19,7 @@
 package org.apache.tamaya.core.internal.converters;
 
 import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.builder.spi.ConversionContext;
+import org.apache.tamaya.spi.ConversionContext;
 import org.junit.Test;
 
 import java.math.RoundingMode;
diff --git a/modules/defaultconfig/pom.xml b/modules/defaultconfig/pom.xml
new file mode 100644
index 0000000..e21d93a
--- /dev/null
+++ b/modules/defaultconfig/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy current the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.tamaya.ext</groupId>
+        <artifactId>tamaya-extensions</artifactId>
+        <version>0.3-incubating-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>tamaya-defaultconfig</artifactId>
+    <name>Apache Tamaya Modules - Default Configuration</name>
+    <packaging>jar</packaging> <!-- bundle -->
+
+    <inceptionYear>2016</inceptionYear>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.tamaya</groupId>
+            <artifactId>tamaya-api</artifactId>
+            <version>${project.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-types</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>java-hamcrest</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/ConfigurationWithDefaults.java b/modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/ConfigurationWithDefaults.java
new file mode 100644
index 0000000..0ddfbbb
--- /dev/null
+++ b/modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/ConfigurationWithDefaults.java
@@ -0,0 +1,72 @@
+/*
+ * 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.tamaya.defaults;
+
+
+import org.apache.tamaya.types.TypeLiteral;
+import org.apache.tamaya.types.TypedConfiguration;
+
+/**
+ * Created by atsticks on 19.07.16.
+ */
+public interface ConfigurationWithDefaults extends TypedConfiguration{
+
+    /**
+     * Get the property key as String, return the default value if no matching value was found.
+     *
+     * @param <T> the type of the class modeled by the type parameter
+     * @param key          the property's absolute, or relative path, e.g. @code
+     *                     a/b/c/d.myProperty}.
+     * @param defaultValue value to be used, if no value is present.
+     * @return the property value, never null..
+     * @throws org.apache.tamaya.ConfigException if the keys could not be converted to the required target type.
+     */
+    <T> T getOrDefault(String key, String defaultValue);
+
+    /**
+     * Get the property key as type T. This will implicitly require a corresponding {@link
+     * org.apache.tamaya.types.spi.PropertyConverter} to be available that is capable current providing type T
+     * fromMap the given String keys.
+     *
+     * @param <T> the type of the class modeled by the type parameter
+     * @param key          the property's absolute, or relative path, e.g. @code
+     *                     a/b/c/d.myProperty}.
+     * @param type         The target type required, not null.
+     * @param defaultValue value to be used, if no value is present.
+     * @return the property value, never null..
+     * @throws org.apache.tamaya.ConfigException if the keys could not be converted to the required target type.
+     */
+    <T> T getOrDefault(String key, Class<T> type, T defaultValue);
+
+    /**
+     * Get the property key as type T. This will implicitly require a corresponding {@link
+     * org.apache.tamaya.types.spi.PropertyConverter} to be available that is capable current providing type T
+     * fromMap the given String keys.
+     *
+     * @param <T> the type of the class modeled by the type parameter
+     * @param key          the property's absolute, or relative path, e.g. @code
+     *                     a/b/c/d.myProperty}.
+     * @param type         The target type required, not null.
+     * @param defaultValue value to be used, if no value is present.
+     * @return the property value, never null..
+     * @throws org.apache.tamaya.ConfigException if the keys could not be converted to the required target type.
+     */
+    <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue);
+
+}
diff --git a/modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/internal/ConfigurationWithDefaultsAdapter.java b/modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/internal/ConfigurationWithDefaultsAdapter.java
new file mode 100644
index 0000000..8101256
--- /dev/null
+++ b/modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/internal/ConfigurationWithDefaultsAdapter.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.defaults.internal;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.spi.ConfigurationAdapter;
+import org.apache.tamaya.defaults.ConfigurationWithDefaults;
+
+/**
+ * Adapter for creating an instance of a {@link org.apache.tamaya.types.TypedConfiguration}.
+ */
+public final class ConfigurationWithDefaultsAdapter implements ConfigurationAdapter{
+
+    @Override
+    public <T> T adapt(Configuration configuration, Class<T> targetType) {
+        if(targetType.equals(ConfigurationWithDefaults.class)){
+            return (T)new DefaultConfigurationWithDefaults(configuration);
+        }
+        return null;
+    }
+}
diff --git a/modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/internal/DefaultConfigurationWithDefaults.java b/modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/internal/DefaultConfigurationWithDefaults.java
new file mode 100644
index 0000000..d9bb4ee
--- /dev/null
+++ b/modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/internal/DefaultConfigurationWithDefaults.java
@@ -0,0 +1,105 @@
+/*
+ * 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.tamaya.defaults.internal;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.apache.tamaya.defaults.ConfigurationWithDefaults;
+import org.apache.tamaya.types.TypeLiteral;
+import org.apache.tamaya.types.TypedConfiguration;
+import org.apache.tamaya.types.internal.adapters.DefaultTypedConfiguration;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Implementation of the {@link TypedConfiguration} API.
+ */
+public class DefaultConfigurationWithDefaults implements ConfigurationWithDefaults {
+    /**
+     * The logger.
+     */
+    private static final Logger LOG = Logger.getLogger(DefaultTypedConfiguration.class.getName());
+
+    private TypedConfiguration configuration;
+
+    /**
+     * Constructor.
+     * @param configuration The configuration to be decorated.
+     */
+    public DefaultConfigurationWithDefaults(Configuration configuration){
+        this.configuration = Objects.requireNonNull(configuration).adapt(TypedConfiguration.class);
+    }
+
+    @Override
+    public String get(String key) {
+        return configuration.get(key);
+    }
+
+    @Override
+    public String getOrDefault(String key, String defaultValue) {
+        String value = configuration.get(key);
+        if(value==null){
+            return defaultValue;
+        }
+        return value;
+    }
+
+    @Override
+    public <T> T getOrDefault(String key, Class<T> type, T defaultValue) {
+        T val = get(key, type);
+        if(val==null){
+            return defaultValue;
+        }
+        return val;
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        return configuration.getProperties();
+    }
+
+    @Override
+    public <T> T adapt(Class<T> type) {
+        if(ConfigurationWithDefaults.class.equals(type)){
+            return (T)this;
+        }
+        return configuration.adapt(type);
+    }
+
+    @Override
+    public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) {
+        T val = get(key, type);
+        if(val==null){
+            return defaultValue;
+        }
+        return val;
+    }
+
+    @Override
+    public <T> T get(String key, Class<T> type) {
+        return configuration.get(key, type);
+    }
+
+    @Override
+    public <T> T get(String key, TypeLiteral<T> type) {
+        return configuration.get(key, type);
+    }
+}
diff --git a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java b/modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/package-info.java
similarity index 68%
copy from code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
copy to modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/package-info.java
index cc66d35..7edba91 100644
--- a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
+++ b/modules/defaultconfig/src/main/java/org/apache/tamaya/defaults/package-info.java
@@ -16,19 +16,11 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya;
-
-
 /**
- * Test Configuration class, that is used to testdata the default methods provided by the API.
+ * This package provides an decorator for {@link org.apache.tamaya.defaults.ConfigurationWithDefaults}
+ * that allows additionally to pass default values either as Strings or typed
+ * objects.
+ *
+ * @see org.apache.tamaya.defaults.ConfigurationWithDefaults
  */
-public class TestConfigurationProvider extends ConfigurationProvider {
-
-    private static final Configuration config = new TestConfiguration();
-
-    @Override
-    public Configuration getConfiguration() {
-        return config;
-    }
-
-}
+package org.apache.tamaya.defaults;
\ No newline at end of file
diff --git a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi b/modules/defaultconfig/src/main/resources/META-INF/services/org.apache.tamaya.adapter.spi.ConfigurationAdapter
similarity index 78%
copy from code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
copy to modules/defaultconfig/src/main/resources/META-INF/services/org.apache.tamaya.adapter.spi.ConfigurationAdapter
index b9c5ba5..56fc494 100644
--- a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
+++ b/modules/defaultconfig/src/main/resources/META-INF/services/org.apache.tamaya.adapter.spi.ConfigurationAdapter
@@ -1,13 +1,12 @@
-#
 # 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 current the License at
+# with the License.  You may obtain a copy of the License at
 #
-#    http://www.apache.org/licenses/LICENSE-2.0
+#  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
@@ -15,5 +14,4 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
-org.apache.tamaya.TestConfigurationProvider
+org.apache.tamaya.defaults.internal.ConfigurationWithDefaultsAdapter
\ No newline at end of file
diff --git a/modules/formats/pom.xml b/modules/formats/pom.xml
index f85a9d4..96282f5 100644
--- a/modules/formats/pom.xml
+++ b/modules/formats/pom.xml
@@ -42,6 +42,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.tamaya.ext</groupId>
+            <artifactId>tamaya-builder</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tamaya.ext</groupId>
             <artifactId>tamaya-resources</artifactId>
             <version>${project.version}</version>
         </dependency>
diff --git a/modules/formats/src/main/java/org/apache/tamaya/format/FlattenedDefaultPropertySource.java b/modules/formats/src/main/java/org/apache/tamaya/format/FlattenedDefaultPropertySource.java
index 9d2097f..a1d510a 100644
--- a/modules/formats/src/main/java/org/apache/tamaya/format/FlattenedDefaultPropertySource.java
+++ b/modules/formats/src/main/java/org/apache/tamaya/format/FlattenedDefaultPropertySource.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tamaya.format;
 
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spi.PropertyValue;
+import org.apache.tamaya.builder.spi.PropertySource;
+import org.apache.tamaya.builder.spi.PropertyValue;
 
 import java.util.Collections;
 import java.util.HashMap;
diff --git a/modules/injection/src/test/java/org/apache/tamaya/inject/internal/DefaultDynamicValueTest.java b/modules/injection/src/test/java/org/apache/tamaya/inject/internal/DefaultDynamicValueTest.java
index de770db..c31f946 100644
--- a/modules/injection/src/test/java/org/apache/tamaya/inject/internal/DefaultDynamicValueTest.java
+++ b/modules/injection/src/test/java/org/apache/tamaya/inject/internal/DefaultDynamicValueTest.java
@@ -20,7 +20,7 @@
 
 import org.apache.tamaya.ConfigException;
 import org.apache.tamaya.ConfigurationProvider;
-import org.apache.tamaya.builder.ConfigurationBuilder;
+import org.apache.tamaya.builder.PropertySourceBasedConfigurationBuilder;
 import org.apache.tamaya.inject.api.ConfiguredItemSupplier;
 import org.apache.tamaya.inject.api.DynamicValue;
 import org.apache.tamaya.inject.api.Config;
@@ -66,7 +66,7 @@
     };
 
     private Map<String,String> properties = new HashMap<>();
-    private Configuration config = new ConfigurationBuilder().addPropertySources(
+    private Configuration config = new PropertySourceBasedConfigurationBuilder().addPropertySources(
             new PropertySource() {
                 @Override
                 public int getOrdinal() {
diff --git a/modules/pom.xml b/modules/pom.xml
index 43f75e5..e99b6eb 100644
--- a/modules/pom.xml
+++ b/modules/pom.xml
@@ -33,6 +33,10 @@
     <packaging>pom</packaging>
 
     <modules>
+        <module>servicecontext</module>
+        <module>adaptersupport</module>
+        <module>types</module>
+        <module>defaultconfig</module>
         <module>builder</module>
         <module>classloader-support</module>
         <module>collections</module>
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ServiceContext.java b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/ServiceContext.java
similarity index 85%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/spi/ServiceContext.java
rename to modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/ServiceContext.java
index 9fbfce8..56dae8d 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ServiceContext.java
+++ b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/ServiceContext.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.spi;
+package org.apache.tamaya.servicecontext;
 
 import java.util.List;
 
@@ -56,4 +56,12 @@
      */
      <T> List<T> getServices(Class<T> serviceType);
 
+    /**
+     * Checks the given instance for a @Priority annotation. If present the annotation's value s evaluated. If no such
+     * annotation is present, a default priority is returned (1);
+     * @param o the instance, not null.
+     * @return a priority, by default 1.
+     */
+    int getPriority(Object o);
+
 }
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ServiceContextManager.java b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/ServiceContextManager.java
similarity index 94%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/spi/ServiceContextManager.java
rename to modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/ServiceContextManager.java
index 3d0e136..5749fc4 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ServiceContextManager.java
+++ b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/ServiceContextManager.java
@@ -16,15 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.spi;
+package org.apache.tamaya.servicecontext;
 
 import java.util.Objects;
 import java.util.ServiceLoader;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import org.apache.tamaya.ConfigException;
-
 
 /**
  * This singleton provides access to the services available in the current {@link ServiceContext}. The
@@ -65,10 +63,10 @@
                 }
             }
         } catch (Exception e) {
-            throw new ConfigException("ServiceContext not loadable", e);
+            throw new IllegalStateException("ServiceContext not loadable", e);
         }
         if (highestServiceContext==null){
-            throw new ConfigException("No ServiceContext found");
+            throw new IllegalStateException("No ServiceContext found");
         }
         LOG.info("Using Service Context of type: " + highestServiceContext.getClass().getName());
         return highestServiceContext;
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultServiceContext.java b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/DefaultServiceContext.java
similarity index 90%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultServiceContext.java
rename to modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/DefaultServiceContext.java
index c75f98d..3f2bfb7 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/DefaultServiceContext.java
+++ b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/DefaultServiceContext.java
@@ -16,10 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.internal;
+package org.apache.tamaya.servicecontext.internal;
 
-import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.builder.spi.ServiceContext;
+import org.apache.tamaya.servicecontext.ServiceContext;
 
 import javax.annotation.Priority;
 import java.text.MessageFormat;
@@ -34,7 +33,7 @@
 import java.util.logging.Logger;
 
 /**
- * This class implements the (default) {@link ServiceContext} interface and hereby uses the JDK
+ * This class implements the (default) {@link org.apache.tamaya.servicecontext.ServiceContext} interface and hereby uses the JDK
  * {@link java.util.ServiceLoader} to load the services required.
  */
 public final class DefaultServiceContext implements ServiceContext {
@@ -97,7 +96,7 @@
      * @param o the instance, not null.
      * @return a priority, by default 1.
      */
-    public static int getPriority(Object o){
+    public int getPriority(Object o){
         int prio = 1; //X TODO discuss default priority
         Priority priority = o.getClass().getAnnotation(Priority.class);
         if (priority != null) {
@@ -112,7 +111,7 @@
      *
      * @return the service with the highest {@link javax.annotation.Priority#value()}
      *
-     * @throws ConfigException if there are multiple service implementations with the maximum priority
+     * @throws IllegalStateException if there are multiple service implementations with the maximum priority
      */
     private <T> T getServiceWithHighestPriority(Collection<T> services, Class<T> serviceType) {
 
@@ -137,7 +136,7 @@
         }
 
         if (highestPriorityServiceCount > 1) {
-            throw new ConfigException(MessageFormat.format("Found {0} implementations for Service {1} with Priority {2}: {3}",
+            throw new IllegalStateException(MessageFormat.format("Found {0} implementations for Service {1} with Priority {2}: {3}",
                                                            highestPriorityServiceCount,
                                                            serviceType.getName(),
                                                            highestPriority,
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIActivator.java b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIActivator.java
similarity index 93%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIActivator.java
rename to modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIActivator.java
index df20d3b..3eac8b9 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIActivator.java
+++ b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIActivator.java
@@ -16,11 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.internal;
+package org.apache.tamaya.servicecontext.internal;
 
-
-
-import org.apache.tamaya.builder.spi.ServiceContextManager;
+import org.apache.tamaya.servicecontext.ServiceContextManager;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceComparator.java b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIServiceComparator.java
similarity index 97%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceComparator.java
rename to modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIServiceComparator.java
index 2ee3ef5..87d6881 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceComparator.java
+++ b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIServiceComparator.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.internal;
+package org.apache.tamaya.servicecontext.internal;
 
 import org.osgi.framework.ServiceReference;
 
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceContext.java b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIServiceContext.java
similarity index 78%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceContext.java
rename to modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIServiceContext.java
index 05c830f..7669361 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceContext.java
+++ b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIServiceContext.java
@@ -16,13 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.internal;
+package org.apache.tamaya.servicecontext.internal;
 
-import org.apache.tamaya.builder.spi.ServiceContext;
+import org.apache.tamaya.servicecontext.ServiceContext;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 
+import javax.annotation.Priority;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -79,4 +80,19 @@
             return Collections.emptyList();
         }
     }
+
+    /**
+     * Checks the given instance for a @Priority annotation. If present the annotation's value s evaluated. If no such
+     * annotation is present, a default priority is returned (1);
+     * @param o the instance, not null.
+     * @return a priority, by default 1.
+     */
+    public int getPriority(Object o){
+        int prio = 1; //X TODO discuss default priority
+        Priority priority = o.getClass().getAnnotation(Priority.class);
+        if (priority != null) {
+            prio = priority.value();
+        }
+        return prio;
+    }
 }
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceLoader.java b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIServiceLoader.java
similarity index 98%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceLoader.java
rename to modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIServiceLoader.java
index cf307d5..dc43801 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceLoader.java
+++ b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/OSGIServiceLoader.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.internal;
+package org.apache.tamaya.servicecontext.internal;
 
 import java.io.BufferedReader;
 import java.io.InputStream;
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceComparator.java b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/PriorityServiceComparator.java
similarity index 86%
copy from modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceComparator.java
copy to modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/PriorityServiceComparator.java
index 2ee3ef5..3895cb0 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/OSGIServiceComparator.java
+++ b/modules/servicecontext/src/main/java/org/apache/tamaya/servicecontext/internal/PriorityServiceComparator.java
@@ -16,9 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.internal;
-
-import org.osgi.framework.ServiceReference;
+package org.apache.tamaya.servicecontext.internal;
 
 import javax.annotation.Priority;
 import java.util.Comparator;
@@ -26,17 +24,17 @@
 /**
  * Comparator implementation for odering services loaded based on their increasing priority values.
  */
-class OSGIServiceComparator implements Comparator<ServiceReference> {
+public class PriorityServiceComparator implements Comparator<Object> {
 
     @Override
-    public int compare(ServiceReference o1, ServiceReference o2) {
+    public int compare(Object o1, Object o2) {
         int prio = getPriority(o1) - getPriority(o2);
         if (prio < 0) {
             return 1;
         } else if (prio > 0) {
             return -1;
         } else {
-            return 0; //o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName());
+            return o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName());
         }
     }
 
diff --git a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi b/modules/servicecontext/src/test/resources/services/org.apache.tamaya.servicecontext.internal.DefaultServiceContextTest$InvalidPriorityInterface
similarity index 71%
copy from code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
copy to modules/servicecontext/src/test/resources/services/org.apache.tamaya.servicecontext.internal.DefaultServiceContextTest$InvalidPriorityInterface
index b9c5ba5..f203fa6 100644
--- a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
+++ b/modules/servicecontext/src/test/resources/services/org.apache.tamaya.servicecontext.internal.DefaultServiceContextTest$InvalidPriorityInterface
@@ -1,13 +1,12 @@
-#
 # 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 current the License at
+# with the License.  You may obtain a copy of the License at
 #
-#    http://www.apache.org/licenses/LICENSE-2.0
+#  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
@@ -15,5 +14,5 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
-org.apache.tamaya.TestConfigurationProvider
+org.apache.tamaya.core.internal.DefaultServiceContextTest$InvalidPriorityImpl1
+org.apache.tamaya.core.internal.DefaultServiceContextTest$InvalidPriorityImpl2
\ No newline at end of file
diff --git a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi b/modules/servicecontext/src/test/resources/services/org.apache.tamaya.servicecontext.internal.DefaultServiceContextTest$MultiImplsInterface
similarity index 67%
copy from code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
copy to modules/servicecontext/src/test/resources/services/org.apache.tamaya.servicecontext.internal.DefaultServiceContextTest$MultiImplsInterface
index b9c5ba5..b144790 100644
--- a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
+++ b/modules/servicecontext/src/test/resources/services/org.apache.tamaya.servicecontext.internal.DefaultServiceContextTest$MultiImplsInterface
@@ -1,13 +1,12 @@
-#
 # 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 current the License at
+# with the License.  You may obtain a copy of the License at
 #
-#    http://www.apache.org/licenses/LICENSE-2.0
+#  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
@@ -15,5 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
-org.apache.tamaya.TestConfigurationProvider
+
+org.apache.tamaya.core.internal.DefaultServiceContextTest$MultiImpl1
+org.apache.tamaya.core.internal.DefaultServiceContextTest$MultiImpl2
+org.apache.tamaya.core.internal.DefaultServiceContextTest$MultiImpl3
\ No newline at end of file
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/PriorityServiceComparator.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/PriorityServiceComparator.java
similarity index 100%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/internal/PriorityServiceComparator.java
rename to modules/types/src/main/java/org/apache/tamaya/types/internal/PriorityServiceComparator.java
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/PropertyConverterManager.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/PropertyConverterManager.java
similarity index 95%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/internal/PropertyConverterManager.java
rename to modules/types/src/main/java/org/apache/tamaya/types/internal/PropertyConverterManager.java
index 1f975ae..1fcfb22 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/internal/PropertyConverterManager.java
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/PropertyConverterManager.java
@@ -16,14 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.internal;
+package org.apache.tamaya.types.internal;
 
 import org.apache.tamaya.ConfigException;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.builder.internal.converters.EnumConverter;
-import org.apache.tamaya.builder.spi.ConversionContext;
-import org.apache.tamaya.builder.spi.PropertyConverter;
-import org.apache.tamaya.builder.spi.ServiceContextManager;
+import org.apache.tamaya.servicecontext.ServiceContext;
+import org.apache.tamaya.servicecontext.ServiceContextManager;
+import org.apache.tamaya.types.TypeLiteral;
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
@@ -65,7 +65,8 @@
 
         @Override
         public int compare(Object o1, Object o2) {
-            int prio = DefaultServiceContext.getPriority(o1) - DefaultServiceContext.getPriority(o2);
+            ServiceContext serviceContext = ServiceContextManager.getServiceContext();
+            int prio = serviceContext.getPriority(o1) - serviceContext.getPriority(o2);
             if (prio < 0) {
                 return 1;
             } else if (prio > 0) {
@@ -174,7 +175,7 @@
      * factory methods taking a single String instance.
      *
      * @return the current map of instantiated and registered converters.
-     * @see #createDefaultPropertyConverter(org.apache.tamaya.TypeLiteral)
+     * @see #createDefaultPropertyConverter(org.apache.tamaya.types.TypeLiteral)
      */
     public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() {
         Lock readLock = lock.readLock();
@@ -212,7 +213,7 @@
      * @param targetType the target type, not null.
      * @param <T>        the type class
      * @return the ordered list of converters (may be empty for not convertible types).
-     * @see #createDefaultPropertyConverter(org.apache.tamaya.TypeLiteral)
+     * @see #createDefaultPropertyConverter(TypeLiteral)
      */
     public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> targetType) {
         Lock readLock = lock.readLock();
@@ -348,7 +349,7 @@
      */
     protected <T> PropertyConverter<T> createDefaultPropertyConverter(final TypeLiteral<T> targetType) {
         if (Enum.class.isAssignableFrom(targetType.getRawType())) {
-            return new EnumConverter<>(targetType.getRawType());
+            return new org.apache.tamaya.types.internal.converters.EnumConverter<>(targetType.getRawType());
         }
         PropertyConverter<T> converter = null;
         final Method factoryMethod = getFactoryMethod(targetType.getRawType(), "of", "valueOf", "instanceOf", "getInstance", "from", "fromString", "parse");
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/ReflectionUtil.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/ReflectionUtil.java
new file mode 100644
index 0000000..da8a74c
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/ReflectionUtil.java
@@ -0,0 +1,42 @@
+///*
+// * Licensed to the Apache Software Foundation (ASF) under one
+// * or more contributor license agreements.  See the NOTICE file
+// * distributed with this work for additional information
+// * regarding copyright ownership.  The ASF licenses this file
+// * to you under the Apache License, Version 2.0 (the
+// * "License"); you may not use this file except in compliance
+// * with the License.  You may obtain a copy of the License at
+// *
+// *   http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing,
+// * software distributed under the License is distributed on an
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// * KIND, either express or implied.  See the License for the
+// * specific language governing permissions and limitations
+// * under the License.
+// */
+//package org.apache.tamaya.builder.internal;
+//
+//import java.lang.reflect.ParameterizedType;
+//import java.lang.reflect.Type;
+//
+//
+///**
+// * Small utility class used by other parts.
+// */
+//public final class ReflectionUtil {
+//
+//    private ReflectionUtil(){}
+//
+//    public static ParameterizedType getParametrizedType(Class<?> clazz) {
+//        Type[] genericTypes = clazz.getGenericInterfaces();
+//        for (Type type : genericTypes) {
+//            if (type instanceof ParameterizedType) {
+//                return (ParameterizedType) type;
+//            }
+//
+//        }
+//        return null;
+//    }
+//}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/adapters/DefaultTypedConfiguration.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/adapters/DefaultTypedConfiguration.java
new file mode 100644
index 0000000..8f919e1
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/adapters/DefaultTypedConfiguration.java
@@ -0,0 +1,154 @@
+/*
+ * 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.tamaya.types.internal.adapters;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.apache.tamaya.types.TypeLiteral;
+import org.apache.tamaya.types.TypedConfiguration;
+import org.apache.tamaya.types.internal.PropertyConverterManager;
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Implementation of the {@link TypedConfiguration} API.
+ */
+public class DefaultTypedConfiguration implements TypedConfiguration {
+    /**
+     * The logger.
+     */
+    private static final Logger LOG = Logger.getLogger(DefaultTypedConfiguration.class.getName());
+
+    private Configuration configuration;
+
+    private PropertyConverterManager propertyConverterManager = new PropertyConverterManager();
+
+    /**
+     * Constructor.
+     * @param configuration The configuration to be decorated.
+     */
+    public DefaultTypedConfiguration(Configuration configuration){
+        this.configuration = Objects.requireNonNull(configuration);
+    }
+
+    private Configuration getConfig(){
+        return this.configuration!=null?this.configuration:ConfigurationProvider.getConfiguration();
+    }
+
+    @Override
+    public String get(String key) {
+        return getConfig().get(key);
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        return getConfig().getProperties();
+    }
+
+    /**
+     * Accesses the current String value for the given key and tries to convert it
+     * using the {@link org.apache.tamaya.types.spi.PropertyConverter} instances provided by
+     * the current context.
+     *
+     * @param key  the property's absolute, or relative path, e.g. @code
+     *             a/b/c/d.myProperty}.
+     * @param type The target type required, not null.
+     * @param <T>  the value type
+     * @return the converted value, never null.
+     */
+    @Override
+    public <T> T get(String key, Class<T> type) {
+        return get(key, (TypeLiteral<T>)TypeLiteral.of(type));
+    }
+
+    /**
+     * Accesses the current String value for the given key and tries to convert it
+     * using the {@link org.apache.tamaya.types.spi.PropertyConverter} instances provided by the current
+     * context.
+     *
+     * @param key  the property's absolute, or relative path, e.g. @code
+     *             a/b/c/d.myProperty}.
+     * @param type The target type required, not null.
+     * @param <T>  the value type
+     * @return the converted value, never null.
+     */
+    @Override
+    public <T> T get(String key, TypeLiteral<T> type) {
+        return convertValue(key, get(key), type);
+    }
+
+    @Override
+    public <T> void addPropertyConverter(TypeLiteral<T> typeToConvert, PropertyConverter<T> propertyConverter) {
+        this.propertyConverterManager.register(typeToConvert, propertyConverter);
+    }
+
+    @Override
+    public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() {
+        return this.propertyConverterManager.getPropertyConverters();
+    }
+
+    @Override
+    public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> type) {
+        return this.propertyConverterManager.getPropertyConverters(type);
+    }
+
+    @Override
+    public void removePropertyConverters(TypeLiteral<?> typeToConvert, PropertyConverter<?>... converters) {
+        removePropertyConverters(typeToConvert, Arrays.asList(converters));
+    }
+
+    @Override
+    public void removePropertyConverters(TypeLiteral<?> typeToConvert, Collection<PropertyConverter<?>> converters) {
+        List<? extends PropertyConverter<?>> existing = this.propertyConverterManager.getPropertyConverters(typeToConvert);
+        if(existing!=null) {
+            existing.removeAll(converters);
+        }
+    }
+
+
+    protected <T> T convertValue(String key, String value, TypeLiteral<T> type) {
+        if (value != null) {
+            List<PropertyConverter<T>> converters = propertyConverterManager.getPropertyConverters(type);
+            ConversionContext context = new ConversionContext.Builder(this, key, type).build();
+            for (PropertyConverter<T> converter : converters) {
+                try {
+                    T t = converter.convert(value, context);
+                    if (t != null) {
+                        return t;
+                    }
+                } catch (Exception e) {
+                    LOG.log(Level.INFO, "PropertyConverter: " + converter + " failed to convert value: " + value, e);
+                }
+            }
+            throw new ConfigException("Unparseable config value for type: " + type.getRawType().getName() + ": " + key +
+                    ", supported formats: " + context.getSupportedFormats());
+        }
+        return null;
+    }
+
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/BigDecimalConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/BigDecimalConverter.java
new file mode 100644
index 0000000..27a997e
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/BigDecimalConverter.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to BigDecimal, the supported format is one of the following:
+ * <ul>
+ *     <li>232573527352.76352753</li>
+ *     <li>-23257352.735276352753</li>
+ *     <li>-0xFFFFFF (integral numbers only)</li>
+ *     <li>-0XFFFFAC (integral numbers only)</li>
+ *     <li>0xFFFFFF (integral numbers only)</li>
+ *     <li>0XFFFFAC (integral numbers only)</li>
+ * </ul>
+ */
+public class BigDecimalConverter implements PropertyConverter<BigDecimal> {
+    /** The logger. */
+    private static final Logger LOG = Logger.getLogger(BigDecimalConverter.class.getName());
+    /** Converter to be used if the format is not directly supported by BigDecimal, e.g. for integral hex values. */
+    private final BigIntegerConverter integerConverter = new BigIntegerConverter();
+
+    @Override
+    public BigDecimal convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(), "<bigDecimal> -> new BigDecimal(String)");
+
+        String trimmed = Objects.requireNonNull(value).trim();
+        try{
+            return new BigDecimal(trimmed);
+        } catch(Exception e){
+            LOG.finest("Parsing BigDecimal failed, trying BigInteger for: " + value);
+            BigInteger bigInt = integerConverter.convert(value, context);
+            if(bigInt!=null){
+                return new BigDecimal(bigInt);
+            }
+            LOG.finest("Failed to parse BigDecimal from: " + value);
+            return null;
+        }
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/BigIntegerConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/BigIntegerConverter.java
new file mode 100644
index 0000000..f7941cf
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/BigIntegerConverter.java
@@ -0,0 +1,94 @@
+/*
+ * 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.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.math.BigInteger;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to BigInteger, the supported format is one of the following:
+ * <ul>
+ *     <li>0xFFFFFF</li>
+ *     <li>0XFFFFAC</li>
+ *     <li>23257352735276352753</li>
+ *     <li>-0xFFFFFF</li>
+ *     <li>-0XFFFFAC</li>
+ *     <li>-23257352735276352753</li>
+ * </ul>
+ */
+public class BigIntegerConverter implements PropertyConverter<BigInteger> {
+
+    /** The logger. */
+    private static final Logger LOG = Logger.getLogger(BigIntegerConverter.class.getName());
+    /** Converter used to decode hex, octal values. */
+    private final ByteConverter byteConverter = new ByteConverter();
+
+    @Override
+    public BigInteger convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(), "[-]0X.. (hex)", "[-]0x... (hex)", "<bigint> -> new BigInteger(bigint)");
+        String trimmed = Objects.requireNonNull(value).trim();
+        if(trimmed.startsWith("0x") || trimmed.startsWith("0X")){
+            LOG.finest("Parsing Hex value to BigInteger: " + value);
+            trimmed = trimmed.substring(2);
+            StringBuilder decimal = new StringBuilder();
+            for(int offset = 0;offset < trimmed.length();offset+=2){
+                if(offset==trimmed.length()-1){
+                    LOG.finest("Invalid Hex-Byte-String: " + value);
+                    return null;
+                }
+                byte val = byteConverter.convert("0x" + trimmed.substring(offset, offset + 2), context);
+                if(val<10){
+                    decimal.append('0').append(val);
+                } else{
+                    decimal.append(val);
+                }
+            }
+            return new BigInteger(decimal.toString());
+        } else if(trimmed.startsWith("-0x") || trimmed.startsWith("-0X")){
+            LOG.finest("Parsing Hex value to BigInteger: " + value);
+            trimmed = trimmed.substring(3);
+            StringBuilder decimal = new StringBuilder();
+            for(int offset = 0;offset < trimmed.length();offset+=2){
+                if(offset==trimmed.length()-1){
+                    LOG.finest("Invalid Hex-Byte-String: " + trimmed);
+                    return null;
+                }
+                byte val = byteConverter.convert("0x" + trimmed.substring(offset, offset + 2), context);
+                if(val<10){
+                    decimal.append('0').append(val);
+                } else{
+                    decimal.append(val);
+                }
+            }
+            return new BigInteger('-' + decimal.toString());
+        }
+        try{
+            return new BigInteger(trimmed);
+        } catch(Exception e){
+            LOG.log(Level.FINEST, "Failed to parse BigInteger from: " + value, e);
+            return null;
+        }
+    }
+
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/BooleanConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/BooleanConverter.java
new file mode 100644
index 0000000..ed5dec3
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/BooleanConverter.java
@@ -0,0 +1,57 @@
+/*
+ * 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.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.util.Locale;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to Boolean.
+ */
+public class BooleanConverter implements PropertyConverter<Boolean> {
+
+    private final Logger LOG = Logger.getLogger(getClass().getName());
+
+    @Override
+    public Boolean convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(), "yes (ignore case)", "y (ignore case)", "true (ignore case)", "t (ignore case)", "no (ignore case)", "n (ignore case)", "false (ignore case)", "f (ignore case)");
+        String ignoreCaseValue = Objects.requireNonNull(value)
+                                        .trim()
+                                        .toLowerCase(Locale.ENGLISH);
+        switch(ignoreCaseValue) {
+            case "yes":
+            case "y":
+            case "true":
+            case "t":
+                return Boolean.TRUE;
+            case "no":
+            case "n":
+            case "false":
+            case "f":
+                return Boolean.FALSE;
+            default:
+                LOG.finest("Unknown boolean value encountered: " + value);
+        }
+        return null;
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/ByteConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/ByteConverter.java
new file mode 100644
index 0000000..0f2f7ca
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/ByteConverter.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.util.Locale;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to Byte, the supported format is one of the following:
+ * <ul>
+ *     <li>123 (byte value)</li>
+ *     <li>0xFF (byte value)</li>
+ *     <li>0XDF (byte value)</li>
+ *     <li>0D1 (byte value)</li>
+ *     <li>-123 (byte value)</li>
+ *     <li>-0xFF (byte value)</li>
+ *     <li>-0XDF (byte value)</li>
+ *     <li>-0D1 (byte value)</li>
+ *     <li>MIN_VALUE (ignoring case)</li>
+ *     <li>MIN (ignoring case)</li>
+ *     <li>MAX_VALUE (ignoring case)</li>
+ *     <li>MAX (ignoring case)</li>
+ * </ul>
+ */
+public class ByteConverter implements PropertyConverter<Byte> {
+
+    private final Logger LOG = Logger.getLogger(getClass().getName());
+
+    @Override
+    public Byte convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(),"<byte>", "MIN_VALUE", "MIN", "MAX_VALUE", "MAX");
+        String trimmed = Objects.requireNonNull(value).trim();
+        switch(trimmed.toUpperCase(Locale.ENGLISH)){
+            case "MIN_VALUE":
+            case "MIN":
+                return Byte.MIN_VALUE;
+            case "MAX_VALUE":
+            case "MAX":
+                return Byte.MAX_VALUE;
+            default:
+                try{
+                    return Byte.decode(trimmed);
+                }
+                catch(Exception e){
+                    LOG.log(Level.FINEST, "Unparseable Byte: " + value);
+                    return null;
+                }
+        }
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/CharConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/CharConverter.java
new file mode 100644
index 0000000..fda210d
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/CharConverter.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to Character, the supported format is one of the following:
+ * <ul>
+ *     <li>'a'</li>
+ *     <li>123 (byte value)</li>
+ *     <li>0xFF (byte value)</li>
+ *     <li>0XDF (byte value)</li>
+ *     <li>0D1 (byte value)</li>
+ * </ul>
+ */
+public class CharConverter implements PropertyConverter<Character> {
+
+    private static final Logger LOG = Logger.getLogger(CharConverter.class.getName());
+
+    @Override
+    public Character convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(),"\\'<char>\\'", "<char>", "<charNum>");
+        String trimmed = Objects.requireNonNull(value).trim();
+        if(trimmed.isEmpty()){
+            return null;
+        }
+        if(trimmed.startsWith("'")) {
+            try {
+                trimmed = trimmed.substring(1, trimmed.length() - 1);
+                if (trimmed.isEmpty()) {
+                    return null;
+                }
+                return trimmed.charAt(0);
+            } catch (Exception e) {
+                LOG.finest("Invalid character format encountered: '" + value + "', valid formats are 'a', 101 and a.");
+                return null;
+            }
+        }
+        try {
+            Integer val = Integer.parseInt(trimmed);
+            return (char) val.shortValue();
+        } catch (Exception e) {
+            LOG.finest("Character format is not numeric: '" + value + "', using first character.");
+            return trimmed.charAt(0);
+        }
+    }
+
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/ClassConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/ClassConverter.java
new file mode 100644
index 0000000..44650d7
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/ClassConverter.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to Class, hereby using the following classloaders:
+ * <ul>
+ *     <li>The current ThreadContext ClassLoader</li>
+ *     <li>The Classloader of this class</li>
+ *     <li>The system Classloader</li>
+ * </ul>
+ */
+public class ClassConverter implements PropertyConverter<Class<?>> {
+
+    private final Logger LOG = Logger.getLogger(getClass().getName());
+
+    @Override
+    public Class<?> convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(),"<fullyQualifiedClassName>");
+        String trimmed = Objects.requireNonNull(value).trim();
+        try{
+            return Class.forName(trimmed, false, Thread.currentThread().getContextClassLoader());
+        }
+        catch(Exception e){
+            LOG.finest("Class not found in context CL: " + trimmed);
+        }
+        try{
+            return Class.forName(trimmed, false, ClassConverter.class.getClassLoader());
+        }
+        catch(Exception e){
+            LOG.finest("Class not found in ClassConverter's CL: " + trimmed);
+        }
+        try{
+            return Class.forName(trimmed, false, ClassLoader.getSystemClassLoader());
+        }
+        catch(Exception e){
+            LOG.finest("Class not found in System CL (giving up): " + trimmed);
+            return null;
+        }
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/CurrencyConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/CurrencyConverter.java
new file mode 100644
index 0000000..141878d
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/CurrencyConverter.java
@@ -0,0 +1,90 @@
+/*
+ * 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.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.util.Currency;
+import java.util.Locale;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to Currency, the supported format is one of the following:
+ * <ul>
+ *     <li>CHF (currency code)</li>
+ *     <li>123 (numeric currency value &gt;
+ *     = 0)</li>
+ *     <li>DE (ISO 2-digit country)</li>
+ *     <li>de_DE, de_DE_123 (Locale)</li>
+ * </ul>
+ */
+public class CurrencyConverter implements PropertyConverter<Currency> {
+
+    private static final Logger LOG = Logger.getLogger(CurrencyConverter.class.getName());
+
+    @Override
+    public Currency convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(), "<currencyCode>, using Locale.ENGLISH", "<numericValue>", "<locale>");
+        String trimmed = Objects.requireNonNull(value).trim();
+        try {
+            return Currency.getInstance(trimmed.toUpperCase(Locale.ENGLISH));
+        } catch (Exception e) {
+            LOG.log(Level.FINEST, "Not a valid textual currency code: " + trimmed + ", checking for numeric...", e);
+        }
+        try {
+            // Check for numeric code
+            Integer numCode = Integer.parseInt(trimmed);
+            for (Currency currency : Currency.getAvailableCurrencies()) {
+                if (currency.getNumericCode() == numCode) {
+                    return currency;
+                }
+            }
+        } catch (Exception e) {
+            LOG.log(Level.FINEST, "Not a valid numeric currency code: " + trimmed + ", checking for locale...", e);
+        }
+        try {
+            // Check for numeric code
+            String[] parts = trimmed.split("\\_");
+            Locale locale;
+            switch (parts.length) {
+                case 1:
+                    locale = new Locale("", parts[0]);
+                    break;
+                case 2:
+                    locale = new Locale(parts[0], parts[1]);
+                    break;
+                case 3:
+                    locale = new Locale(parts[0], parts[1], parts[2]);
+                    break;
+                default:
+                    locale = null;
+            }
+            if (locale != null) {
+                return Currency.getInstance(locale);
+            }
+            LOG.finest("Not a valid currency: " + trimmed + ", giving up...");
+        } catch (Exception e) {
+            LOG.log(Level.FINEST, "Not a valid country locale for currency: " + trimmed + ", giving up...", e);
+        }
+        return null;
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/DoubleConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/DoubleConverter.java
new file mode 100644
index 0000000..84ccda4
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/DoubleConverter.java
@@ -0,0 +1,82 @@
+/*
+ * 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.tamaya.types.internal.converters;
+
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.util.Locale;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to Double, using the Java number syntax:
+ * (-)?[0-9]*\.[0-9]*. In case of error the value given also is tried being parsed as integral number using
+ * {@link LongConverter}. Additionally the following values are supported:
+ * <ul>
+ * <li>NaN (ignoring case)</li>
+ * <li>POSITIVE_INFINITY (ignoring case)</li>
+ * <li>NEGATIVE_INFINITY (ignoring case)</li>
+ * </ul>
+ */
+public class DoubleConverter implements PropertyConverter<Double> {
+    /**
+     * The logger.
+     */
+    private static final Logger LOG = Logger.getLogger(DoubleConverter.class.getName());
+    /**
+     * The converter used, when floating point parse failed.
+     */
+    private final LongConverter integerConverter = new LongConverter();
+
+    @Override
+    public Double convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(), "<double>", "MIN", "MIN_VALUE", "MAX", "MAX_VALUE", "POSITIVE_INFINITY", "NEGATIVE_INFINITY", "NAN");
+        String trimmed = Objects.requireNonNull(value).trim();
+        switch (trimmed.toUpperCase(Locale.ENGLISH)) {
+            case "POSITIVE_INFINITY":
+                return Double.POSITIVE_INFINITY;
+            case "NEGATIVE_INFINITY":
+                return Double.NEGATIVE_INFINITY;
+            case "NAN":
+                return Double.NaN;
+            case "MIN_VALUE":
+            case "MIN":
+                return Double.MIN_VALUE;
+            case "MAX_VALUE":
+            case "MAX":
+                return Double.MAX_VALUE;
+            default:
+                try {
+                    return Double.valueOf(trimmed);
+                } catch (Exception e) {
+                    // OK perhaps we have an integral number that must be converted to the double type...
+                    LOG.finest("Parsing of double as floating number failed, trying parsing integral" +
+                            " number/hex instead...");
+                }
+                Long val = integerConverter.convert(trimmed, context);
+                if(val!=null){
+                    return val.doubleValue();
+                }
+                return null;
+        }
+
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/EnumConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/EnumConverter.java
new file mode 100644
index 0000000..54cfd58
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/EnumConverter.java
@@ -0,0 +1,68 @@
+/*
+ * 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.tamaya.types.internal.converters;
+
+import org.apache.tamaya.ConfigException;
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Locale;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to tge given enum type.
+ */
+public class EnumConverter<T> implements PropertyConverter<T> {
+    private final Logger LOG = Logger.getLogger(EnumConverter.class.getName());
+    private Class<T> enumType;
+    private Method factory;
+
+    public EnumConverter(Class<T> enumType) {
+        if (!Enum.class.isAssignableFrom(enumType)) {
+            throw new IllegalArgumentException("Not an Enum: " + enumType.getName());
+        }
+        this.enumType = Objects.requireNonNull(enumType);
+        try {
+            this.factory = enumType.getMethod("valueOf", String.class);
+        } catch (NoSuchMethodException e) {
+            throw new ConfigException("Uncovertible enum type without valueOf method found, please provide a custom " +
+                    "PropertyConverter for: " + enumType.getName());
+        }
+    }
+
+    @Override
+    public T convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(),"<enumValue>");
+        try {
+            return (T) factory.invoke(null, value);
+        } catch (InvocationTargetException | IllegalAccessException e) {
+            LOG.log(Level.FINEST, "Invalid enum value '" + value + "' for " + enumType.getName(), e);
+        }
+        try {
+            return (T) factory.invoke(null, value.toUpperCase(Locale.ENGLISH));
+        } catch (InvocationTargetException | IllegalAccessException e) {
+            LOG.log(Level.FINEST, "Invalid enum value '" + value + "' for " + enumType.getName(), e);
+        }
+        return null;
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/FloatConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/FloatConverter.java
new file mode 100644
index 0000000..026c740
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/FloatConverter.java
@@ -0,0 +1,81 @@
+/*
+ * 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.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.util.Locale;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to Float, using the Java number syntax:
+ * (-)?[0-9]*\.[0-9]*. In case of error the value given also is tried being parsed as integral number using
+ * {@link LongConverter}. Additionally the following values are supported:
+ * <ul>
+ * <li>NaN (ignoring case)</li>
+ * <li>POSITIVE_INFINITY (ignoring case)</li>
+ * <li>NEGATIVE_INFINITY (ignoring case)</li>
+ * </ul>
+ */
+public class FloatConverter implements PropertyConverter<Float> {
+    /**
+     * The logger.
+     */
+    private static final Logger LOG = Logger.getLogger(FloatConverter.class.getName());
+    /**
+     * The converter used, when floating point parse failed.
+     */
+    private final IntegerConverter integerConverter = new IntegerConverter();
+
+    @Override
+    public Float convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(), "<float>", "MIN", "MIN_VALUE", "MAX", "MAX_VALUE", "POSITIVE_INFINITY", "NEGATIVE_INFINITY", "NAN");
+        String trimmed = Objects.requireNonNull(value).trim();
+        switch(trimmed.toUpperCase(Locale.ENGLISH)){
+            case "POSITIVE_INFINITY":
+                return Float.POSITIVE_INFINITY;
+            case "NEGATIVE_INFINITY":
+                return Float.NEGATIVE_INFINITY;
+            case "NAN":
+                return Float.NaN;
+            case "MIN_VALUE":
+            case "MIN":
+                return Float.MIN_VALUE;
+            case "MAX_VALUE":
+            case "MAX":
+                return Float.MAX_VALUE;
+            default:
+                try {
+                    return Float.valueOf(trimmed);
+                } catch(Exception e){
+                    // OK perhaps we have an integral number that must be converted to the double type...
+                    LOG.finest("Parsing of float as floating number failed, trying parsing integral" +
+                            " number/hex instead...");
+                }
+                Integer val = integerConverter.convert(trimmed, context);
+                if(val!=null) {
+                    return val.floatValue();
+                }
+                LOG.finest("Unparseable float value: " + trimmed);
+                return null;
+        }
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/IntegerConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/IntegerConverter.java
new file mode 100644
index 0000000..4a69224
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/IntegerConverter.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.util.Locale;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to Integer, the supported format is one of the following:
+ * <ul>
+ *     <li>123 (byte value)</li>
+ *     <li>0xFF (byte value)</li>
+ *     <li>0XDF (byte value)</li>
+ *     <li>0D1 (byte value)</li>
+ *     <li>-123 (byte value)</li>
+ *     <li>-0xFF (byte value)</li>
+ *     <li>-0XDF (byte value)</li>
+ *     <li>-0D1 (byte value)</li>
+ *     <li>MIN_VALUE (ignoring case)</li>
+ *     <li>MIN (ignoring case)</li>
+ *     <li>MAX_VALUE (ignoring case)</li>
+ *     <li>MAX (ignoring case)</li>
+ * </ul>
+ */
+public class IntegerConverter implements PropertyConverter<Integer>{
+
+    /**
+     * The logger.
+     */
+    private static final Logger LOG = Logger.getLogger(IntegerConverter.class.getName());
+
+    @Override
+    public Integer convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(), "<int>", "MIN_VALUE", "MIN", "MAX_VALUE", "MAX");
+        String trimmed = Objects.requireNonNull(value).trim();
+        switch(trimmed.toUpperCase(Locale.ENGLISH)){
+            case "MIN_VALUE":
+            case "MIN":
+                return Integer.MIN_VALUE;
+            case "MAX_VALUE":
+            case "MAX":
+                return Integer.MAX_VALUE;
+            default:
+                try{
+                    return Integer.decode(trimmed);
+                }
+                catch(Exception e){
+                    LOG.finest("Unparseable Integer value: " + trimmed);
+                    return null;
+                }
+        }
+
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/LongConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/LongConverter.java
new file mode 100644
index 0000000..8af5fbe
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/LongConverter.java
@@ -0,0 +1,72 @@
+/*
+ * 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.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.util.Locale;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to Long, the supported format is one of the following:
+ * <ul>
+ *     <li>123 (byte value)</li>
+ *     <li>0xFF (byte value)</li>
+ *     <li>0XDF (byte value)</li>
+ *     <li>0D1 (byte value)</li>
+ *     <li>-123 (byte value)</li>
+ *     <li>-0xFF (byte value)</li>
+ *     <li>-0XDF (byte value)</li>
+ *     <li>-0D1 (byte value)</li>
+ *     <li>MIN_VALUE (ignoring case)</li>
+ *     <li>MIN (ignoring case)</li>
+ *     <li>MAX_VALUE (ignoring case)</li>
+ *     <li>MAX (ignoring case)</li>
+ * </ul>
+ */
+public class LongConverter implements PropertyConverter<Long>{
+
+    private static final Logger LOGGER = Logger.getLogger(LongConverter.class.getName());
+
+    @Override
+    public Long convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(), "<long>", "MIN", "MIN_VALUE", "MAX", "MAX_VALUE");
+
+        String trimmed = Objects.requireNonNull(value).trim();
+            switch (trimmed.toUpperCase(Locale.ENGLISH)) {
+                case "MIN_VALUE":
+                case "MIN":
+                    return Long.MIN_VALUE;
+                case "MAX_VALUE":
+                case "MAX":
+                    return Long.MAX_VALUE;
+                default:
+                    try {
+                        return Long.decode(trimmed);
+                    }
+                    catch(Exception e){
+                        LOGGER.finest("Unable to parse Long value: " + value);
+                        return null;
+                    }
+            }
+
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/NumberConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/NumberConverter.java
new file mode 100644
index 0000000..b4af638
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/NumberConverter.java
@@ -0,0 +1,72 @@
+/*
+ * 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.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.math.BigDecimal;
+import java.util.Locale;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to Number. Valid inputs are:
+ * <pre>
+ *     POSITIVE_INFINITY -&gt; Double.POSITIVE_INFINITY
+ *     NEGATIVE_INFINITY -&gt; Double.NEGATIVE_INFINITY
+ *     NaN &gt; Double.NaN
+ *     0xFFDCD3D2 -&gt; Long
+ *     1234566789.23642327352735273752 -&gt; new BigDecimal(input)
+ * </pre>
+ */
+public class NumberConverter implements PropertyConverter<Number>{
+    /** the logger. */
+    private static final Logger LOGGER = Logger.getLogger(NumberConverter.class.getName());
+    /** Converter used for trying to parse as an integral value. */
+    private final LongConverter longConverter = new LongConverter();
+
+    @Override
+    public Number convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(), "<double>, <long>", "0x (hex)", "0X... (hex)", "POSITIVE_INFINITY",
+                "NEGATIVE_INFINITY", "NAN");
+
+        String trimmed = Objects.requireNonNull(value).trim();
+        switch(trimmed.toUpperCase(Locale.ENGLISH)) {
+            case "POSITIVE_INFINITY":
+                return Double.POSITIVE_INFINITY;
+            case "NEGATIVE_INFINITY":
+                return Double.NEGATIVE_INFINITY;
+            case "NAN":
+                return Double.NaN;
+            default:
+                Long lVal = longConverter.convert(trimmed, context);
+                if (lVal != null) {
+                    return lVal;
+                }
+                try{
+                    return new BigDecimal(trimmed);
+                }
+                catch(Exception e){
+                    LOGGER.finest("Unparseable Number: " + trimmed);
+                    return null;
+                }
+        }
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/ShortConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/ShortConverter.java
new file mode 100644
index 0000000..9c1db35
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/ShortConverter.java
@@ -0,0 +1,72 @@
+/*
+ * 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.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.util.Locale;
+import java.util.Objects;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to Short, the supported format is one of the following:
+ * <ul>
+ *     <li>123 (byte value)</li>
+ *     <li>0xFF (byte value)</li>
+ *     <li>0XDF (byte value)</li>
+ *     <li>0D1 (byte value)</li>
+ *     <li>-123 (byte value)</li>
+ *     <li>-0xFF (byte value)</li>
+ *     <li>-0XDF (byte value)</li>
+ *     <li>-0D1 (byte value)</li>
+ *     <li>MIN_VALUE (ignoring case)</li>
+ *     <li>MIN (ignoring case)</li>
+ *     <li>MAX_VALUE (ignoring case)</li>
+ *     <li>MAX (ignoring case)</li>
+ * </ul>
+ */
+public class ShortConverter implements PropertyConverter<Short>{
+
+    /** the logger. */
+    private static final Logger LOG = Logger.getLogger(ShortConverter.class.getName());
+
+    @Override
+    public Short convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(), "short", "MIN", "MIN_VALUE", "MAX", "MAX_VALUE");
+        String trimmed = Objects.requireNonNull(value).trim();
+        switch(trimmed.toUpperCase(Locale.ENGLISH)){
+            case "MIN_VALUE":
+            case "MIN":
+                return Short.MIN_VALUE;
+            case "MAX_VALUE":
+            case "MAX":
+                return Short.MAX_VALUE;
+            default:
+                try{
+                    return Short.decode(trimmed);
+                }
+                catch(Exception e){
+                    LOG.finest("Unparseable Short: " + trimmed);
+                    return null;
+                }
+        }
+    }
+
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/URIConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/URIConverter.java
new file mode 100644
index 0000000..6a86d71
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/URIConverter.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.net.URI;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to URI, using new URI(value).
+ */
+public class URIConverter implements PropertyConverter<URI> {
+
+    private final Logger LOG = Logger.getLogger(getClass().getName());
+
+    @Override
+    public URI convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(), "<uri> -> new URI(uri)");
+        String trimmed = Objects.requireNonNull(value).trim();
+        try {
+            return new URI(trimmed);
+        } catch (Exception e) {
+            LOG.log(Level.FINE, "Unparseable URI: " + trimmed, e);
+        }
+        return null;
+    }
+}
diff --git a/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/URLConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/URLConverter.java
new file mode 100644
index 0000000..0cff508
--- /dev/null
+++ b/modules/types/src/main/java/org/apache/tamaya/types/internal/converters/URLConverter.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.types.internal.converters;
+
+import org.apache.tamaya.types.spi.ConversionContext;
+import org.apache.tamaya.types.spi.PropertyConverter;
+
+import java.net.URL;
+import java.util.Objects;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Converter, converting from String to URI, using new URL(value).
+ */
+public class URLConverter implements PropertyConverter<URL> {
+
+    private final Logger LOG = Logger.getLogger(getClass().getName());
+
+    @Override
+    public URL convert(String value, ConversionContext context) {
+        context.addSupportedFormats(getClass(),"<URL>");
+        String trimmed = Objects.requireNonNull(value).trim();
+        try {
+            return new URL(trimmed);
+        } catch (Exception e) {
+            LOG.log(Level.FINE, "Unparseable URL: " + trimmed, e);
+        }
+        return null;
+    }
+}
diff --git a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java b/modules/types/src/main/java/org/apache/tamaya/types/package-info.java
similarity index 68%
copy from code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
copy to modules/types/src/main/java/org/apache/tamaya/types/package-info.java
index cc66d35..24c86a9 100644
--- a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
+++ b/modules/types/src/main/java/org/apache/tamaya/types/package-info.java
@@ -16,19 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya;
-
-
 /**
- * Test Configuration class, that is used to testdata the default methods provided by the API.
+ * This package provides
+ * {@link org.apache.tamaya.builder.ConfigurationBuilder a configuration
+ * builder} that allows to build a configuration manually without
+ * using exclusively on the Service Provider Interface API of Tamaya.
+ *
+ * @see org.apache.tamaya.builder.ConfigurationBuilder
+ * @see org.apache.tamaya.Configuration
  */
-public class TestConfigurationProvider extends ConfigurationProvider {
-
-    private static final Configuration config = new TestConfiguration();
-
-    @Override
-    public Configuration getConfiguration() {
-        return config;
-    }
-
-}
+package org.apache.tamaya.builder;
\ No newline at end of file
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConversionContext.java b/modules/types/src/main/java/org/apache/tamaya/types/spi/ConversionContext.java
similarity index 87%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConversionContext.java
rename to modules/types/src/main/java/org/apache/tamaya/types/spi/ConversionContext.java
index 298e8bc..33e68de 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/ConversionContext.java
+++ b/modules/types/src/main/java/org/apache/tamaya/types/spi/ConversionContext.java
@@ -16,10 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.spi;
+package org.apache.tamaya.types.spi;
 
 import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.types.TypeLiteral;
 
 import java.lang.reflect.AnnotatedElement;
 import java.util.ArrayList;
@@ -40,7 +40,6 @@
     private final TypeLiteral<?> targetType;
     private final AnnotatedElement annotatedElement;
     private final List<String> supportedFormats = new ArrayList<>();
-    private final ConfigurationContext configurationContext;
 
     /**
      * Private constructor used from builder.
@@ -52,7 +51,6 @@
         this.targetType = builder.targetType;
         this.supportedFormats.addAll(builder.supportedFormats);
         this.configuration = builder.configuration;
-        this.configurationContext = builder.configurationContext;
     }
 
     /**
@@ -126,18 +124,12 @@
                 '}';
     }
 
-    public ConfigurationContext getConfigurationContext() {
-        return configurationContext;
-    }
-
     /**
      * Builder to create new instances of {@link ConversionContext}.
      */
     public static final class Builder{
         /** The backing configuration. */
         private Configuration configuration;
-        /** The configuration context. */
-        private ConfigurationContext configurationContext;
         /** The accessed key, or null. */
         private String key;
         /** The target type. */
@@ -152,7 +144,7 @@
          * @param targetType the target type
          */
         public Builder(TypeLiteral<?> targetType) {
-            this(null, null, null, targetType);
+            this(null, null, targetType);
         }
 
         /**
@@ -161,20 +153,18 @@
          * @param targetType the target type
          */
         public Builder(String key, TypeLiteral<?> targetType) {
-            this(null, null, key, targetType);
+            this(null, key, targetType);
         }
 
         /**
          * Creates a new Builder instance.
          * @param configuration the configuration, not null.
-         * @param configurationContext configuration context, not null.
          * @param key the requested key, may be null.
          * @param targetType the target type
          */
-        public Builder(Configuration configuration, ConfigurationContext configurationContext, String key, TypeLiteral<?> targetType){
+        public Builder(Configuration configuration, String key, TypeLiteral<?> targetType){
             this.key = key;
             this.configuration = configuration;
-            this.configurationContext = configurationContext;
             this.targetType = Objects.requireNonNull(targetType);
         }
 
@@ -199,16 +189,6 @@
         }
 
         /**
-         * Sets the configuration.
-         * @param configurationContext the configuration, not null
-         * @return the builder instance, for chaining
-         */
-        public Builder setConfigurationContext(ConfigurationContext configurationContext){
-            this.configurationContext = Objects.requireNonNull(configurationContext);
-            return this;
-        }
-
-        /**
          * Sets the annotated element, when configuration is injected.
          * @param annotatedElement the annotated element, not null
          * @return the builder instance, for chaining
@@ -244,7 +224,6 @@
         public String toString() {
             return "Builder{" +
                     "configuration=" + configuration +
-                    "context=" + configurationContext +
                     ", key='" + key + '\'' +
                     ", targetType=" + targetType +
                     ", annotatedElement=" + annotatedElement +
diff --git a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/PropertyConverter.java b/modules/types/src/main/java/org/apache/tamaya/types/spi/PropertyConverter.java
similarity index 97%
rename from modules/builder/src/main/java/org/apache/tamaya/builder/spi/PropertyConverter.java
rename to modules/types/src/main/java/org/apache/tamaya/types/spi/PropertyConverter.java
index 83f6644..8787cc0 100644
--- a/modules/builder/src/main/java/org/apache/tamaya/builder/spi/PropertyConverter.java
+++ b/modules/types/src/main/java/org/apache/tamaya/types/spi/PropertyConverter.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.builder.spi;
+package org.apache.tamaya.types.spi;
 
 
 /**
diff --git a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi b/modules/types/src/main/resources/META-INF/services/org.apache.tamaya.adapter.spi.ConfigurationAdapter
similarity index 78%
copy from code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
copy to modules/types/src/main/resources/META-INF/services/org.apache.tamaya.adapter.spi.ConfigurationAdapter
index b9c5ba5..c05c7b7 100644
--- a/code/api/src/test/resources/META-INF/services/org.apache.tamaya.builder.spi.ConfigurationProviderSpi
+++ b/modules/types/src/main/resources/META-INF/services/org.apache.tamaya.adapter.spi.ConfigurationAdapter
@@ -1,13 +1,12 @@
-#
 # 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 current the License at
+# with the License.  You may obtain a copy of the License at
 #
-#    http://www.apache.org/licenses/LICENSE-2.0
+#  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
@@ -15,5 +14,4 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-#
-org.apache.tamaya.TestConfigurationProvider
+org.apache.tamaya.types.internal.adapters.TypedConfigurationAdapter
\ No newline at end of file
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/PropertyConverterManagerTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/PropertyConverterManagerTest.java
new file mode 100644
index 0000000..f53941e
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/PropertyConverterManagerTest.java
@@ -0,0 +1,178 @@
+/*
+ * 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.tamaya.core.internal;
+
+
+import org.apache.tamaya.builder.spi.ConversionContext;
+import org.apache.tamaya.builder.spi.PropertyConverter;
+import org.apache.tamaya.TypeLiteral;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+
+public class PropertyConverterManagerTest {
+
+    private final ConversionContext DUMMY_CONTEXT = new ConversionContext.Builder(
+            "someKey", TypeLiteral.of(Object.class)).build();
+
+    @Test
+    public void customTypeWithFactoryMethodOfIsRecognizedAsSupported() {
+        PropertyConverterManager manager = new PropertyConverterManager();
+
+        assertThat(manager.isTargetTypeSupported(TypeLiteral.of(MyType.class)),
+                   is(true));
+    }
+
+    @Test
+    public void factoryMethodOfIsUsedAsConverter() {
+        PropertyConverterManager manager = new PropertyConverterManager();
+
+        List<PropertyConverter<MyType>> converters = manager.getPropertyConverters(
+                (TypeLiteral)TypeLiteral.of(MyType.class));
+
+        assertThat(converters, hasSize(1));
+
+        PropertyConverter<MyType> converter = converters.get(0);
+
+        Object result = converter.convert("IN", DUMMY_CONTEXT);
+
+        assertThat(result, notNullValue());
+        assertThat(result, instanceOf(MyType.class));
+        assertThat(((MyType)result).getValue(), equalTo("IN"));
+    }
+
+    @Test
+    public void testDirectConverterMapping(){
+        PropertyConverterManager manager = new PropertyConverterManager();
+        List<PropertyConverter<C>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(C.class)));
+        assertThat(converters, hasSize(1));
+
+        PropertyConverter<C> converter = converters.get(0);
+        C result = converter.convert("testDirectConverterMapping", DUMMY_CONTEXT);
+
+        assertThat(result, notNullValue());
+        assertThat(result, instanceOf(C.class));
+        assertThat((result).getInValue(), equalTo("testDirectConverterMapping"));
+    }
+
+    @Test
+    public void testDirectSuperclassConverterMapping(){
+        PropertyConverterManager manager = new PropertyConverterManager();
+        List<PropertyConverter<B>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(B.class)));
+        assertThat(converters, hasSize(1));
+        converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(B.class)));
+        assertThat(converters, hasSize(1));
+
+        PropertyConverter<B> converter = converters.get(0);
+        B result = converter.convert("testDirectSuperclassConverterMapping", DUMMY_CONTEXT);
+
+        assertThat(result, notNullValue());
+        assertThat(result, instanceOf(C.class));
+        assertThat(((C)result).getInValue(), equalTo("testDirectSuperclassConverterMapping"));
+    }
+
+    @Test
+    public void testMultipleConverterLoad(){
+        PropertyConverterManager manager = new PropertyConverterManager();
+        List<PropertyConverter<B>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(B.class)));
+        assertThat(converters, hasSize(1));
+        manager = new PropertyConverterManager();
+        converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(B.class)));
+        assertThat(converters, hasSize(1));
+    }
+
+    @Test
+    public void testTransitiveSuperclassConverterMapping(){
+        PropertyConverterManager manager = new PropertyConverterManager();
+        List<PropertyConverter<A>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(A.class)));
+        assertThat(converters, hasSize(1));
+
+        PropertyConverter<A> converter = converters.get(0);
+        A result = converter.convert("testTransitiveSuperclassConverterMapping", DUMMY_CONTEXT);
+
+        assertThat(result, notNullValue());
+        assertThat(result, instanceOf(C.class));
+        assertThat(((C)result).getInValue(), equalTo("testTransitiveSuperclassConverterMapping"));
+    }
+
+    @Test
+    public void testDirectInterfaceMapping(){
+        PropertyConverterManager manager = new PropertyConverterManager();
+        List<PropertyConverter<Readable>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(Readable.class)));
+        assertThat(converters, hasSize(1));
+
+        PropertyConverter<Readable> converter = converters.get(0);
+        Readable result = converter.convert("testDirectInterfaceMapping", DUMMY_CONTEXT);
+
+        assertThat(result, notNullValue());
+        assertThat(result, instanceOf(C.class));
+        assertThat(((C)result).getInValue(), equalTo("testDirectInterfaceMapping"));
+    }
+
+    @Test
+    public void testTransitiveInterfaceMapping1(){
+        PropertyConverterManager manager = new PropertyConverterManager();
+        List<PropertyConverter<Runnable>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(Runnable.class)));
+        assertThat(converters, hasSize(1));
+
+        PropertyConverter<Runnable> converter = converters.get(0);
+        Runnable result = converter.convert("testTransitiveInterfaceMapping1", DUMMY_CONTEXT);
+
+        assertThat(result, notNullValue());
+        assertThat(result, instanceOf(C.class));
+        assertThat(((C)result).getInValue(), equalTo("testTransitiveInterfaceMapping1"));
+    }
+
+    @Test
+    public void testTransitiveInterfaceMapping2(){
+        PropertyConverterManager manager = new PropertyConverterManager();
+        List<PropertyConverter<AutoCloseable>> converters = List.class.cast(manager.getPropertyConverters(TypeLiteral.of(AutoCloseable.class)));
+        assertThat(converters, hasSize(1));
+
+        PropertyConverter<AutoCloseable> converter = converters.get(0);
+        AutoCloseable result = converter.convert("testTransitiveInterfaceMapping2", DUMMY_CONTEXT);
+
+        assertThat(result, notNullValue());
+        assertThat(result, instanceOf(C.class));
+        assertThat(((C)result).getInValue(), equalTo("testTransitiveInterfaceMapping2"));
+    }
+
+    public static class MyType {
+        private final String typeValue;
+
+        private MyType(String value) {
+            typeValue = value;
+        }
+
+        public static MyType of(String source) {
+            return new MyType(source);
+        }
+
+        public String getValue() {
+            return typeValue;
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/BigDecimalConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/BigDecimalConverterTest.java
new file mode 100644
index 0000000..9c71688
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/BigDecimalConverterTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.junit.Test;
+
+import java.math.BigDecimal;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests the default converter for bytes.
+ */
+public class BigDecimalConverterTest {
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_BigDecimal_Decimal() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        BigDecimal valueRead = config.get("tests.converter.bd.decimal", BigDecimal.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead, new BigDecimal(101));
+    }
+
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_BigDecimal_Hex() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        BigDecimal valueRead = config.get("tests.converter.bd.hex.lowerX", BigDecimal.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead, new BigDecimal("47"));
+        valueRead = config.get("tests.converter.bd.hex.upperX", BigDecimal.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead, new BigDecimal("63"));
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_NotPresent() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        BigDecimal valueRead = config.get("tests.converter.bd.foo", BigDecimal.class);
+        assertFalse(valueRead != null);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_BigDecimal_BigValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        BigDecimal valueRead = config.get("tests.converter.bd.big", BigDecimal.class);
+        assertTrue(valueRead != null);
+        assertEquals(new BigDecimal("101666666666666662333337263723628763821638923628193612983618293628763"),
+                valueRead);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_BigDecimal_BigFloatValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        BigDecimal valueRead = config.get("tests.converter.bd.bigFloat", BigDecimal.class);
+        assertTrue(valueRead != null);
+        assertEquals(new BigDecimal("1016666666666666623333372637236287638216389293628763.1016666666666666623333372" +
+                "63723628763821638923628193612983618293628763"), valueRead);
+    }
+}
\ No newline at end of file
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/BooleanConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/BooleanConverterTest.java
new file mode 100644
index 0000000..ac75c34
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/BooleanConverterTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.junit.Test;
+
+/**
+ * Tests the default converter for bytes.
+ */
+public class BooleanConverterTest {
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Byte() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        // trues
+        Boolean valueRead = config.get("tests.converter.boolean.y1", Boolean.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead, Boolean.TRUE);
+        valueRead = config.get("tests.converter.boolean.y2", Boolean.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead, Boolean.TRUE);
+        valueRead = config.get("tests.converter.boolean.yes1", Boolean.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead, Boolean.TRUE);
+        valueRead = config.get("tests.converter.boolean.yes2", Boolean.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead, Boolean.TRUE);
+        valueRead = config.get("tests.converter.boolean.yes3", Boolean.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead, Boolean.TRUE);
+        valueRead = config.get("tests.converter.boolean.true1", Boolean.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead, Boolean.TRUE);
+        valueRead = config.get("tests.converter.boolean.true2", Boolean.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead, Boolean.TRUE);
+        valueRead = config.get("tests.converter.boolean.true3", Boolean.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead, Boolean.TRUE);
+        valueRead = config.get("tests.converter.boolean.t1", Boolean.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead, Boolean.TRUE);
+        valueRead = config.get("tests.converter.boolean.t2", Boolean.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead, Boolean.TRUE);
+        // falses
+        valueRead = config.get("tests.converter.boolean.n1", Boolean.class);
+        assertNotNull(valueRead);
+        assertFalse(valueRead);
+        valueRead = config.get("tests.converter.boolean.n2", Boolean.class);
+        assertNotNull(valueRead);
+        assertFalse(valueRead);
+        valueRead = config.get("tests.converter.boolean.no1", Boolean.class);
+        assertFalse(valueRead);
+        assertFalse(valueRead);
+        valueRead = config.get("tests.converter.boolean.no2", Boolean.class);
+        assertNotNull(valueRead);
+        assertFalse(valueRead);
+        valueRead = config.get("tests.converter.boolean.no3", Boolean.class);
+        assertNotNull(valueRead);
+        assertFalse(valueRead);
+        valueRead = config.get("tests.converter.boolean.false1", Boolean.class);
+        assertNotNull(valueRead);
+        assertFalse(valueRead);
+        valueRead = config.get("tests.converter.boolean.false2", Boolean.class);
+        assertNotNull(valueRead);
+        assertFalse(valueRead);
+        valueRead = config.get("tests.converter.boolean.false3", Boolean.class);
+        assertNotNull(valueRead);
+        assertFalse(valueRead);
+        valueRead = config.get("tests.converter.boolean.f1", Boolean.class);
+        assertNotNull(valueRead);
+        assertFalse(valueRead);
+        valueRead = config.get("tests.converter.boolean.f2", Boolean.class);
+        assertNotNull(valueRead);
+        assertFalse(valueRead);
+        valueRead = config.get("tests.converter.boolean.foo", Boolean.class);
+        assertNull(valueRead);
+    }
+}
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/ByteConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/ByteConverterTest.java
new file mode 100644
index 0000000..132674d
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/ByteConverterTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests the default converter for bytes.
+ */
+public class ByteConverterTest {
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Byte() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Byte valueRead = config.get("tests.converter.byte.decimal", Byte.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead.byteValue(), 101);
+        valueRead = config.get("tests.converter.byte.octal", Byte.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead.byteValue(), Byte.decode("02").byteValue());
+        valueRead = config.get("tests.converter.byte.hex.lowerX", Byte.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead.byteValue(), Byte.decode("0x2F").byteValue());
+        valueRead = config.get("tests.converter.byte.hex.upperX", Byte.class);
+        assertNotNull(valueRead);
+        assertEquals(valueRead.byteValue(), Byte.decode("0X3F").byteValue());
+        valueRead = config.get("tests.converter.byte.foo", Byte.class);
+        assertNull(valueRead);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Byte_MinValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Byte valueRead = config.get("tests.converter.byte.min", Byte.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Byte.MIN_VALUE, valueRead.byteValue());
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Byte_MaxValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Byte valueRead = config.get("tests.converter.byte.max", Byte.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Byte.MAX_VALUE, valueRead.byteValue());
+    }
+}
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/CharConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/CharConverterTest.java
new file mode 100644
index 0000000..f27a465
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/CharConverterTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests conversion of the {@link CharConverter}.
+ */
+public class CharConverterTest {
+
+    @Test
+    public void testConvert_Character() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Character valueRead = config.get("tests.converter.char.f", Character.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.charValue(), 'f');
+    }
+
+    @Test
+    public void testConvert_Character_Numeric() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Character valueRead = config.get("tests.converter.char.f-numeric", Character.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.charValue(), (char)101);
+    }
+
+    @Test
+    public void testConvert_Character_Quoted() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Character valueRead = config.get("tests.converter.char.d", Character.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.charValue(), 'd');
+    }
+
+    @Test
+    public void testConvert_Character_WithWhitspace_Before() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Character valueRead = config.get("tests.converter.char.f-before", Character.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.charValue(), 'f');
+    }
+
+    @Test
+    public void testConvert_Character_WithWhitspace_After() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Character valueRead = config.get("tests.converter.char.f-after", Character.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.charValue(), 'f');
+    }
+
+    @Test
+    public void testConvert_Character_WithWhitspace_Around() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Character valueRead = config.get("tests.converter.char.f-around", Character.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.charValue(), 'f');
+    }
+
+    @Test
+    public void testConvert_NotPresent() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Character valueRead = config.get("tests.converter.char.foo", Character.class);
+        assertNull(valueRead);
+    }
+}
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/ConverterTestsPropertySource.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/ConverterTestsPropertySource.java
new file mode 100644
index 0000000..3f34384
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/ConverterTestsPropertySource.java
@@ -0,0 +1,253 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.builder.spi.PropertySource;
+import org.apache.tamaya.builder.spi.PropertyValue;
+
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Test Property Source used by converter tests.
+ */
+public class ConverterTestsPropertySource implements PropertySource{
+    @Override
+    public int getOrdinal() {
+        return 0;
+    }
+
+    @Override
+    public String getName(){
+        return "ConverterTestsPropertySource";
+    }
+
+    @Override
+    public PropertyValue get(String key) {
+        switch(key){
+            // Bytes
+            case "tests.converter.byte.decimal":
+                return PropertyValue.of(key, "101", getName());
+            case "tests.converter.byte.octal":
+                return PropertyValue.of(key, "02", getName());
+            case "tests.converter.byte.hex.lowerX":
+                return PropertyValue.of(key, "0x2F", getName());
+            case "tests.converter.byte.hex.upperX":
+                return PropertyValue.of(key, "0X3F", getName());
+            case "tests.converter.byte.min":
+                return PropertyValue.of(key, "min", getName());
+            case "tests.converter.byte.max":
+                return PropertyValue.of(key, "MAX_Value", getName());
+            // Boolean
+            case "tests.converter.boolean.y1":
+                return PropertyValue.of(key, "y", getName());
+            case "tests.converter.boolean.y2":
+                return PropertyValue.of(key, "Y", getName());
+            case "tests.converter.boolean.yes1":
+                return PropertyValue.of(key, "yes", getName());
+            case "tests.converter.boolean.yes2":
+                return PropertyValue.of(key, "Yes", getName());
+            case "tests.converter.boolean.yes3":
+                return PropertyValue.of(key, "yeS", getName());
+            case "tests.converter.boolean.true1":
+                return PropertyValue.of(key, "true", getName());
+            case "tests.converter.boolean.true2":
+                return PropertyValue.of(key, "True", getName());
+            case "tests.converter.boolean.true3":
+                return PropertyValue.of(key, "trUe", getName());
+            case "tests.converter.boolean.t1":
+                return PropertyValue.of(key, "t", getName());
+            case "tests.converter.boolean.t2":
+                return PropertyValue.of(key, "T", getName());
+            case "tests.converter.boolean.n1":
+                return PropertyValue.of(key, "n", getName());
+            case "tests.converter.boolean.n2":
+                return PropertyValue.of(key, "N", getName());
+            case "tests.converter.boolean.no1":
+                return PropertyValue.of(key, "no", getName());
+            case "tests.converter.boolean.no2":
+                return PropertyValue.of(key, "No", getName());
+            case "tests.converter.boolean.no3":
+                return PropertyValue.of(key, "nO", getName());
+            case "tests.converter.boolean.false1":
+                return PropertyValue.of(key, "false", getName());
+            case "tests.converter.boolean.false2":
+                return PropertyValue.of(key, "False", getName());
+            case "tests.converter.boolean.false3":
+                return PropertyValue.of(key, "falSe", getName());
+            case "tests.converter.boolean.f1":
+                return PropertyValue.of(key, "f", getName());
+            case "tests.converter.boolean.f2":
+                return PropertyValue.of(key, "F", getName());
+            // Character
+            case "tests.converter.char.f":
+                return PropertyValue.of(key, "f", getName());
+            case "tests.converter.char.d":
+                return PropertyValue.of(key, "'d'", getName());
+            case "tests.converter.char.f-before":
+                return PropertyValue.of(key, "  f", getName());
+            case "tests.converter.char.f-after":
+                return PropertyValue.of(key, "f   ", getName());
+            case "tests.converter.char.f-around":
+                return PropertyValue.of(key, "   f      ", getName());
+            case "tests.converter.char.f-numeric":
+                return PropertyValue.of(key, "101", getName());
+            // currency
+            case "tests.converter.currency.code1":
+                return PropertyValue.of(key, "CHF", getName());
+            case "tests.converter.currency.code2":
+                return PropertyValue.of(key, "cHf", getName());
+            case "tests.converter.currency.code3":
+                return PropertyValue.of(key, "  CHF", getName());
+            case "tests.converter.currency.code4":
+                return PropertyValue.of(key, "CHF   ", getName());
+            case "tests.converter.currency.code5":
+                return PropertyValue.of(key, "  CHF   ", getName());
+            case "tests.converter.currency.code-numeric1":
+                return PropertyValue.of(key, "100", getName());
+            case "tests.converter.currency.code-numeric2":
+                return PropertyValue.of(key, "  100", getName());
+            case "tests.converter.currency.code-numeric3":
+                return PropertyValue.of(key, "100  ", getName());
+            case "tests.converter.currency.code-numeric4":
+                return PropertyValue.of(key, "  100  ", getName());
+            case "tests.converter.currency.code-locale1":
+                return PropertyValue.of(key, "DE", getName());
+            case "tests.converter.currency.code-locale2":
+                return PropertyValue.of(key, "  DE", getName());
+            case "tests.converter.currency.code-locale3":
+                return PropertyValue.of(key, "DE  ", getName());
+            case "tests.converter.currency.code-locale4":
+                return PropertyValue.of(key, "  DE  ", getName());
+            //double
+            case "tests.converter.double.decimal":
+                return PropertyValue.of(key, "1.23456789", getName());
+            case "tests.converter.double.decimalNegative":
+                return PropertyValue.of(key, "-1.23456789", getName());
+            case "tests.converter.double.integer":
+                return PropertyValue.of(key, "  100", getName());
+            case "tests.converter.double.hex1":
+                return PropertyValue.of(key, " 0XFF", getName());
+            case "tests.converter.double.hex2":
+                return PropertyValue.of(key, "-0xFF  ", getName());
+            case "tests.converter.double.hex3":
+                return PropertyValue.of(key, "#FF", getName());
+            case "tests.converter.double.octal":
+                return PropertyValue.of(key, "0013", getName());
+            case "tests.converter.double.min":
+                return PropertyValue.of(key, "MIN_Value", getName());
+            case "tests.converter.double.max":
+                return PropertyValue.of(key, "max", getName());
+            case "tests.converter.double.nan":
+                return PropertyValue.of(key, "NAN", getName());
+            case "tests.converter.double.pi":
+                return PropertyValue.of(key, "positive_infinity", getName());
+            case "tests.converter.double.ni":
+                return PropertyValue.of(key, "Negative_Infinity", getName());
+            //float
+            case "tests.converter.float.decimal":
+                return PropertyValue.of(key, "1.23456789", getName());
+            case "tests.converter.float.decimalNegative":
+                return PropertyValue.of(key, "-1.23456789", getName());
+            case "tests.converter.float.integer":
+                return PropertyValue.of(key, "  100", getName());
+            case "tests.converter.float.hex1":
+                return PropertyValue.of(key, " 0XFF", getName());
+            case "tests.converter.float.hex2":
+                return PropertyValue.of(key, "-0xFF  ", getName());
+            case "tests.converter.float.hex3":
+                return PropertyValue.of(key, "#FF", getName());
+            case "tests.converter.float.octal":
+                return PropertyValue.of(key, "0013", getName());
+            case "tests.converter.float.min":
+                return PropertyValue.of(key, "MIN_Value", getName());
+            case "tests.converter.float.max":
+                return PropertyValue.of(key, "max", getName());
+            case "tests.converter.float.nan":
+                return PropertyValue.of(key, "NAN", getName());
+            case "tests.converter.float.pi":
+                return PropertyValue.of(key, "positive_infinity", getName());
+            case "tests.converter.float.ni":
+                return PropertyValue.of(key, "Negative_Infinity", getName());
+            // Integer
+            case "tests.converter.integer.decimal":
+                return PropertyValue.of(key, "101", getName());
+            case "tests.converter.integer.octal":
+                return PropertyValue.of(key, "02", getName());
+            case "tests.converter.integer.hex.lowerX":
+                return PropertyValue.of(key, "0x2F", getName());
+            case "tests.converter.integer.hex.upperX":
+                return PropertyValue.of(key, "0X3F", getName());
+            case "tests.converter.integer.min":
+                return PropertyValue.of(key, "min", getName());
+            case "tests.converter.integer.max":
+                return PropertyValue.of(key, "MAX_Value", getName());
+            // Long
+            case "tests.converter.long.decimal":
+                return PropertyValue.of(key, "101", getName());
+            case "tests.converter.long.octal":
+                return PropertyValue.of(key, "02", getName());
+            case "tests.converter.long.hex.lowerX":
+                return PropertyValue.of(key, "0x2F", getName());
+            case "tests.converter.long.hex.upperX":
+                return PropertyValue.of(key, "0X3F", getName());
+            case "tests.converter.long.min":
+                return PropertyValue.of(key, "min", getName());
+            case "tests.converter.long.max":
+                return PropertyValue.of(key, "MAX_Value", getName());
+            // Short
+            case "tests.converter.short.decimal":
+                return PropertyValue.of(key, "101", getName());
+            case "tests.converter.short.octal":
+                return PropertyValue.of(key, "02", getName());
+            case "tests.converter.short.hex.lowerX":
+                return PropertyValue.of(key, "0x2F", getName());
+            case "tests.converter.short.hex.upperX":
+                return PropertyValue.of(key, "0X3F", getName());
+            case "tests.converter.short.min":
+                return PropertyValue.of(key, "min", getName());
+            case "tests.converter.short.max":
+                return PropertyValue.of(key, "MAX_Value", getName());
+            // BigDecimal
+            case "tests.converter.bd.decimal":
+                return PropertyValue.of(key, "101", getName());
+            case "tests.converter.bd.float":
+                return PropertyValue.of(key, "101.36438746", getName());
+            case "tests.converter.bd.big":
+                return PropertyValue.of(key, "101666666666666662333337263723628763821638923628193612983618293628763", getName());
+            case "tests.converter.bd.bigFloat":
+                return PropertyValue.of(key, "1016666666666666623333372637236287638216389293628763.101666666666666662333337263723628763821638923628193612983618293628763", getName());
+            case "tests.converter.bd.hex.lowerX":
+                return PropertyValue.of(key, "0x2F", getName());
+            case "tests.converter.bd.hex.upperX":
+                return PropertyValue.of(key, "0X3F", getName());
+        }
+        return null;
+    }
+
+    @Override
+    public Map<String, String> getProperties() {
+        return Collections.emptyMap();
+    }
+
+    @Override
+    public boolean isScannable() {
+        return false;
+    }
+}
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/CurrencyConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/CurrencyConverterTest.java
new file mode 100644
index 0000000..9113ca2
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/CurrencyConverterTest.java
@@ -0,0 +1,154 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.junit.Test;
+
+import java.util.Currency;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests the default converter for bytes.
+ */
+public class CurrencyConverterTest {
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Currency_Code_CHF() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Currency valueRead = config.get("tests.converter.currency.code1", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead, Currency.getInstance("CHF"));
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Currency_Code_cHf() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Currency valueRead = config.get("tests.converter.currency.code2", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead, Currency.getInstance("CHF"));
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Currency_Code_CHF_Whitespace_Before() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Currency valueRead = config.get("tests.converter.currency.code3", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead, Currency.getInstance("CHF"));
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Currency_Code_CHF_Whitespace_After() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Currency valueRead = config.get("tests.converter.currency.code4", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead, Currency.getInstance("CHF"));
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Currency_Code_CHF_Whitespace_Around() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Currency valueRead = config.get("tests.converter.currency.code5", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead, Currency.getInstance("CHF"));
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Currency_Code_Numeric() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Currency valueRead = config.get("tests.converter.currency.code-numeric1", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.getNumericCode(), Currency.getInstance("BGL").getNumericCode());
+        valueRead = config.get("tests.converter.currency.code-numeric2", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.getNumericCode(), Currency.getInstance("BGL").getNumericCode());
+        valueRead = config.get("tests.converter.currency.code-numeric3", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.getNumericCode(), Currency.getInstance("BGL").getNumericCode());
+        valueRead = config.get("tests.converter.currency.code-numeric4", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.getNumericCode(), Currency.getInstance("BGL").getNumericCode());
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Currency_Code_Locale() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Currency valueRead = config.get("tests.converter.currency.code-locale1", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.getCurrencyCode(), "EUR");
+        valueRead = config.get("tests.converter.currency.code-locale2", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.getCurrencyCode(), "EUR");
+        valueRead = config.get("tests.converter.currency.code-locale3", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.getCurrencyCode(), "EUR");
+        valueRead = config.get("tests.converter.currency.code-locale4", Currency.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.getCurrencyCode(), "EUR");
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_NotPresent() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Byte valueRead = config.get("tests.converter.byte.foo", Byte.class);
+        assertFalse(valueRead!=null);
+    }
+}
\ No newline at end of file
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/DoubleConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/DoubleConverterTest.java
new file mode 100644
index 0000000..ee2f33a
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/DoubleConverterTest.java
@@ -0,0 +1,175 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests the default converter for bytes.
+ */
+public class DoubleConverterTest {
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Double_Decimal() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Double valueRead = config.get("tests.converter.double.decimal", Double.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.doubleValue(), 1.23456789, 0.0d);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Double_DecimalNegative() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Double valueRead = config.get("tests.converter.double.decimalNegative", Double.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.doubleValue(), -1.23456789, 0.0d);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Double_Integer() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Double valueRead = config.get("tests.converter.double.integer", Double.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.doubleValue(),100d, 0.0d);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Double_Hex1() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Double valueRead = config.get("tests.converter.double.hex1", Double.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.doubleValue(),255d, 0.0d);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Double_Hex2() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Double valueRead = config.get("tests.converter.double.hex2", Double.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.doubleValue(),-255d, 0.0d);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Double_Hex3() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Double valueRead = config.get("tests.converter.double.hex3", Double.class);
+        assertTrue(valueRead!=null);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Double_MinValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Double valueRead = config.get("tests.converter.double.min", Double.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Double.MIN_VALUE, valueRead.doubleValue(),0.0d);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Double_MaxValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Double valueRead = config.get("tests.converter.double.max", Double.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Double.MAX_VALUE, valueRead.doubleValue(),0.0d);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Double_NaNValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Double valueRead = config.get("tests.converter.double.nan", Double.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Double.NaN, valueRead.doubleValue(),0.0d);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Double_PositiveInfinityValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Double valueRead = config.get("tests.converter.double.pi", Double.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Double.POSITIVE_INFINITY, valueRead.doubleValue(),0.0d);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Double_NegativeInfinityValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Double valueRead = config.get("tests.converter.double.ni", Double.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Double.NEGATIVE_INFINITY, valueRead.doubleValue(),0.0d);
+    }
+
+}
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/EnumConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/EnumConverterTest.java
new file mode 100644
index 0000000..52d643e
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/EnumConverterTest.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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.TypeLiteral;
+import org.apache.tamaya.builder.spi.ConversionContext;
+import org.junit.Test;
+
+import java.math.RoundingMode;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+/**
+ * Test class testing the {@link EnumConverter} class.
+ */
+public class EnumConverterTest {
+
+    private final EnumConverter testConverter = new EnumConverter(RoundingMode.class);
+
+    private final ConversionContext DUMMY_CONTEXT = new ConversionContext.Builder("someKey", TypeLiteral.of(Enum.class)).build();
+
+    @Test
+    public void testConvert() {
+        assertEquals(testConverter.convert(RoundingMode.CEILING.toString(),
+                DUMMY_CONTEXT), RoundingMode.CEILING);
+    }
+
+    @Test
+    public void testConvert_LowerCase() {
+        assertEquals(testConverter.convert("ceiling", DUMMY_CONTEXT), RoundingMode.CEILING);
+    }
+
+    @Test
+    public void testConvert_MixedCase()  {
+        assertEquals(testConverter.convert("CeiLinG", DUMMY_CONTEXT), RoundingMode.CEILING);
+    }
+
+    @Test
+    public void testConvert_OtherValue() {
+        assertNull(testConverter.convert("fooBars", DUMMY_CONTEXT));
+    }
+}
\ No newline at end of file
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/FloatConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/FloatConverterTest.java
new file mode 100644
index 0000000..98ea720
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/FloatConverterTest.java
@@ -0,0 +1,176 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests the default converter for bytes.
+ */
+public class FloatConverterTest {
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Float_Decimal() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Float valueRead = config.get("tests.converter.float.decimal", Float.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.floatValue(), 1.23456789f, 0.0f);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Float_DecimalNegative() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Float valueRead = config.get("tests.converter.float.decimalNegative", Float.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.floatValue(), -1.23456789f, 0.0f);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Float_Integer() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Float valueRead = config.get("tests.converter.float.integer", Float.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.floatValue(),100f, 0.0f);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Float_Hex1() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Float valueRead = config.get("tests.converter.float.hex1", Float.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.floatValue(),255f, 0.0f);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Float_Hex2() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Float valueRead = config.get("tests.converter.float.hex2", Float.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.floatValue(),-255f, 0.0f);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Float_Hex3() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Float valueRead = config.get("tests.converter.float.hex3", Float.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead.floatValue(),255f, 0.0f);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Float_MinValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Float valueRead = config.get("tests.converter.float.min", Float.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Float.MIN_VALUE, valueRead.floatValue(),0.0f);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Float_MaxValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Float valueRead = config.get("tests.converter.float.max", Float.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Float.MAX_VALUE, valueRead.floatValue(),0.0f);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Float_NaNValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Float valueRead = config.get("tests.converter.float.nan", Float.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Float.NaN, valueRead.floatValue(),0.0f);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Float_PositiveInfinityValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Float valueRead = config.get("tests.converter.float.pi", Float.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Float.POSITIVE_INFINITY, valueRead.floatValue(),0.0f);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Float_NegativeInfinityValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Float valueRead = config.get("tests.converter.float.ni", Float.class);
+        assertTrue(valueRead!=null);
+        assertEquals(Float.NEGATIVE_INFINITY, valueRead.floatValue(),0.0f);
+    }
+
+}
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/IntegerConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/IntegerConverterTest.java
new file mode 100644
index 0000000..03b0f12
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/IntegerConverterTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests the default converter for Integers.
+ */
+public class IntegerConverterTest {
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Integer_Decimal() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Integer valueRead = config.get("tests.converter.integer.decimal", Integer.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), 101);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Integer_Octal() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Integer valueRead = config.get("tests.converter.integer.octal", Integer.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), Integer.decode("02").intValue());
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Integer_Hex() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Integer valueRead = config.get("tests.converter.integer.hex.lowerX", Integer.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), Integer.decode("0x2F").intValue());
+        valueRead = config.get("tests.converter.integer.hex.upperX", Integer.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), Integer.decode("0X3F").intValue());
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_NotPresent() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Integer valueRead = config.get("tests.converter.integer.foo", Integer.class);
+        assertFalse(valueRead != null);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Integer_MinValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Integer valueRead = config.get("tests.converter.integer.min", Integer.class);
+        assertTrue(valueRead != null);
+        assertEquals(Integer.MIN_VALUE, valueRead.intValue());
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Integer_MaxValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Integer valueRead = config.get("tests.converter.integer.max", Integer.class);
+        assertTrue(valueRead != null);
+        assertEquals(Integer.MAX_VALUE, valueRead.intValue());
+    }
+}
\ No newline at end of file
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/LongConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/LongConverterTest.java
new file mode 100644
index 0000000..0df6b09
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/LongConverterTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests the default converter for Longs.
+ */
+public class LongConverterTest {
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Long_Decimal() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Long valueRead = config.get("tests.converter.long.decimal", Long.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), 101);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Long_Octal() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Long valueRead = config.get("tests.converter.long.octal", Long.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), Long.decode("02").intValue());
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Long_Hex() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Long valueRead = config.get("tests.converter.long.hex.lowerX", Long.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), Long.decode("0x2F").intValue());
+        valueRead = config.get("tests.converter.long.hex.upperX", Long.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), Long.decode("0X3F").intValue());
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_NotPresent() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Long valueRead = config.get("tests.converter.long.foo", Long.class);
+        assertFalse(valueRead != null);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Long_MinValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Long valueRead = config.get("tests.converter.long.min", Long.class);
+        assertTrue(valueRead != null);
+        assertEquals(Long.MIN_VALUE, valueRead.longValue());
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Long_MaxValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Long valueRead = config.get("tests.converter.long.max", Long.class);
+        assertTrue(valueRead != null);
+        assertEquals(Long.MAX_VALUE, valueRead.longValue());
+    }
+}
\ No newline at end of file
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/NumberConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/NumberConverterTest.java
new file mode 100644
index 0000000..3fa2e58
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/NumberConverterTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.junit.Test;
+
+import java.math.BigDecimal;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests the default converter for Number.
+ */
+public class NumberConverterTest {
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Decimal() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Number valueRead = config.get("tests.converter.bd.decimal", Number.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead, 101L);
+    }
+
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Hex() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Number valueRead = config.get("tests.converter.bd.hex.lowerX", Number.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead, Long.valueOf("47"));
+        valueRead = config.get("tests.converter.bd.hex.upperX", Number.class);
+        assertTrue(valueRead!=null);
+        assertEquals(valueRead, Long.valueOf("63"));
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_NotPresent() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Number valueRead = config.get("tests.converter.bd.foo", Number.class);
+        assertFalse(valueRead!=null);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_BigValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Number valueRead = config.get("tests.converter.bd.big", Number.class);
+        assertTrue(valueRead!=null);
+        assertEquals(new BigDecimal("101666666666666662333337263723628763821638923628193612983618293628763"),
+                valueRead);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_BigFloatValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Number valueRead = config.get("tests.converter.bd.bigFloat", Number.class);
+        assertTrue(valueRead!=null);
+        assertEquals(new BigDecimal("1016666666666666623333372637236287638216389293628763.1016666666666666623333372" +
+                "63723628763821638923628193612983618293628763"), valueRead);
+    }
+}
\ No newline at end of file
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/ShortConverterTest.java b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/ShortConverterTest.java
new file mode 100644
index 0000000..193a92e
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/internal/converters/ShortConverterTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.tamaya.core.internal.converters;
+
+import org.apache.tamaya.Configuration;
+import org.apache.tamaya.ConfigurationProvider;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Tests the default converter for Shorts.
+ */
+public class ShortConverterTest {
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Short_Decimal() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Short valueRead = config.get("tests.converter.short.decimal", Short.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), 101);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Short_Octal() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Short valueRead = config.get("tests.converter.short.octal", Short.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), Short.decode("02").intValue());
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Short_Hex() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Short valueRead = config.get("tests.converter.short.hex.lowerX", Short.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), Short.decode("0x2F").intValue());
+        valueRead = config.get("tests.converter.short.hex.upperX", Short.class);
+        assertTrue(valueRead != null);
+        assertEquals(valueRead.intValue(), Short.decode("0X3F").intValue());
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_NotPresent() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Short valueRead = config.get("tests.converter.short.foo", Short.class);
+        assertFalse(valueRead != null);
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Short_MinValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Short valueRead = config.get("tests.converter.short.min", Short.class);
+        assertTrue(valueRead != null);
+        assertEquals(Short.MIN_VALUE, valueRead.intValue());
+    }
+
+    /**
+     * Test conversion. The value are provided by
+     * {@link org.apache.tamaya.core.internal.converters.ConverterTestsPropertySource}.
+     * @throws Exception
+     */
+    @Test
+    public void testConvert_Short_MaxValue() throws Exception {
+        Configuration config = ConfigurationProvider.getConfiguration();
+        Short valueRead = config.get("tests.converter.short.max", Short.class);
+        assertTrue(valueRead != null);
+        assertEquals(Short.MAX_VALUE, valueRead.intValue());
+    }
+}
\ No newline at end of file
diff --git a/modules/types/src/test/java/org/apache/tamaya/types/util/mockito/NotMockedAnswer.java b/modules/types/src/test/java/org/apache/tamaya/types/util/mockito/NotMockedAnswer.java
new file mode 100644
index 0000000..3188d85
--- /dev/null
+++ b/modules/types/src/test/java/org/apache/tamaya/types/util/mockito/NotMockedAnswer.java
@@ -0,0 +1,57 @@
+/*
+ * 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.tamaya.builder.util.mockito;
+
+import org.mockito.exceptions.base.MockitoException;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import java.io.Serializable;
+
+// @todo This is a duplicated class
+public class NotMockedAnswer implements Answer<Object>, Serializable {
+    public final static NotMockedAnswer NOT_MOCKED_ANSWER = new NotMockedAnswer();
+
+    private NotMockedAnswer() {
+    }
+
+    @Override
+    public Object answer(InvocationOnMock invocation) throws Throwable {
+        if("toString".equals(invocation.getMethod().getName())){
+            return "Some "+invocation.getMethod().getDeclaringClass().getName();
+        }
+        StringBuilder msgBuilder = new StringBuilder();
+
+        msgBuilder.append("Invocation of method not mocked: ")
+                  .append(invocation.getMethod().toGenericString());
+
+        if (invocation.getArguments().length > 0) {
+            msgBuilder.append(" Supplied arguments: ");
+
+            for (int i = 0; i < invocation.getArguments().length; i++) {
+                msgBuilder.append(invocation.getArguments()[i]);
+
+                if (i - 1 < invocation.getArguments().length) {
+                    msgBuilder.append(", ");
+                }
+            }
+        }
+        throw new MockitoException(msgBuilder.toString());
+    }
+}
diff --git a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java b/modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeA.java
similarity index 69%
rename from code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
rename to modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeA.java
index cc66d35..89b2f5b 100644
--- a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
+++ b/modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeA.java
@@ -16,19 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya;
-
+package org.apache.tamaya.builder.util.types;
 
 /**
- * Test Configuration class, that is used to testdata the default methods provided by the API.
+ * Custom type with two argument constructor.
  */
-public class TestConfigurationProvider extends ConfigurationProvider {
+public class CustomTypeA {
+    private String name;
 
-    private static final Configuration config = new TestConfiguration();
-
-    @Override
-    public Configuration getConfiguration() {
-        return config;
+    public CustomTypeA(String name, String other) {
+        this.name = name + other;
     }
 
+    public String getName() {
+        return name;
+    }
 }
diff --git a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java b/modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeB.java
similarity index 65%
copy from code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
copy to modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeB.java
index cc66d35..f7f4d99 100644
--- a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
+++ b/modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeB.java
@@ -16,19 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya;
-
+package org.apache.tamaya.builder.util.types;
 
 /**
- * Test Configuration class, that is used to testdata the default methods provided by the API.
+ * Custom type with factory method
+ * {@link org.apache.tamaya.builder.util.types.CustomTypeB#of(String)}
  */
-public class TestConfigurationProvider extends ConfigurationProvider {
+public class CustomTypeB {
+    private String name;
 
-    private static final Configuration config = new TestConfiguration();
-
-    @Override
-    public Configuration getConfiguration() {
-        return config;
+    private CustomTypeB(String value) {
+        this.name = value;
     }
 
+    public String getName() {
+        return name;
+    }
+
+    public static CustomTypeB of(String source) {
+        return new CustomTypeB(source);
+    }
 }
diff --git a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java b/modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeC.java
similarity index 67%
copy from code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
copy to modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeC.java
index cc66d35..da9ce56 100644
--- a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
+++ b/modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeC.java
@@ -16,19 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya;
+package org.apache.tamaya.builder.util.types;
+
+public class CustomTypeC {
+    private String value;
 
 
-/**
- * Test Configuration class, that is used to testdata the default methods provided by the API.
- */
-public class TestConfigurationProvider extends ConfigurationProvider {
-
-    private static final Configuration config = new TestConfiguration();
-
-    @Override
-    public Configuration getConfiguration() {
-        return config;
+    public CustomTypeC(String in, @SuppressWarnings("unused") int iHideThisConstructorForTamaya) {
+        value = in;
     }
 
+    public String getValue() {
+        return value;
+    }
+
+    public static CustomTypeC produceFrom(String in) {
+        return new CustomTypeC(in, -1);
+    }
 }
diff --git a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java b/modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeCPropertyConverter.java
similarity index 63%
copy from code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
copy to modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeCPropertyConverter.java
index cc66d35..084b38b 100644
--- a/code/api/src/test/java/org/apache/tamaya/TestConfigurationProvider.java
+++ b/modules/types/src/test/java/org/apache/tamaya/types/util/types/CustomTypeCPropertyConverter.java
@@ -16,19 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya;
+package org.apache.tamaya.builder.util.types;
 
+import org.apache.tamaya.builder.spi.ConversionContext;
+import org.apache.tamaya.builder.spi.PropertyConverter;
 
-/**
- * Test Configuration class, that is used to testdata the default methods provided by the API.
- */
-public class TestConfigurationProvider extends ConfigurationProvider {
-
-    private static final Configuration config = new TestConfiguration();
-
+public class CustomTypeCPropertyConverter implements PropertyConverter<org.apache.tamaya.builder.util.types.CustomTypeC> {
     @Override
-    public Configuration getConfiguration() {
-        return config;
+    public org.apache.tamaya.builder.util.types.CustomTypeC convert(String value, ConversionContext context) {
+        return org.apache.tamaya.builder.util.types.CustomTypeC.produceFrom(value);
     }
-
 }
