You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tamaya.apache.org by an...@apache.org on 2018/01/03 00:09:00 UTC

[04/18] incubator-tamaya-extensions git commit: Adapted to comply with JSR API.

Adapted to comply with JSR API.

Signed-off-by: Anatole Tresch <an...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/commit/581c92e7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/tree/581c92e7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/diff/581c92e7

Branch: refs/heads/configjsr
Commit: 581c92e70777af1fa9ec6a4af0ca8d95b334526b
Parents: 06f29e1
Author: Anatole Tresch <an...@apache.org>
Authored: Mon Dec 25 11:41:21 2017 +0100
Committer: Anatole Tresch <an...@apache.org>
Committed: Mon Dec 25 11:41:21 2017 +0100

----------------------------------------------------------------------
 modules/functions/pom.xml                       |   5 -
 .../tamaya/functions/CombinedConfiguration.java | 130 ++----
 .../functions/ConfigWrappingConfigSource.java   |  73 ++++
 .../functions/ConfigWrappingPropertySource.java |  84 ----
 .../functions/ConfigurationFunctions.java       | 415 ++++++------------
 .../tamaya/functions/EnrichedConfiguration.java | 138 ++----
 .../tamaya/functions/FilteredConfiguration.java |  88 +---
 .../tamaya/functions/MappedConfiguration.java   |  92 ++--
 .../functions/CombinedConfigurationTest.java    | 420 ++++++-------------
 .../functions/ConfigurationFunctionsTest.java   |  38 +-
 .../functions/EnrichedConfigurationTest.java    | 355 +++++++---------
 .../functions/MappedConfigurationTest.java      |  11 +-
 12 files changed, 620 insertions(+), 1229 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/pom.xml
----------------------------------------------------------------------
diff --git a/modules/functions/pom.xml b/modules/functions/pom.xml
index 839b67e..17de980 100644
--- a/modules/functions/pom.xml
+++ b/modules/functions/pom.xml
@@ -32,11 +32,6 @@ under the License.
     <packaging>jar</packaging>
 
     <dependencies>
-        <dependency>
-            <groupId>org.apache.tamaya</groupId>
-            <artifactId>tamaya-api</artifactId>
-            <version>${tamaya-apicore.version}</version>
-        </dependency>
         <!-- Test scope only, do not create a code dependency! -->
         <dependency>
             <groupId>org.apache.tamaya</groupId>

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java
index 2e3f0cc..10961b4 100644
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/CombinedConfiguration.java
@@ -18,19 +18,15 @@
  */
 package org.apache.tamaya.functions;
 
-import org.apache.tamaya.ConfigOperator;
-import org.apache.tamaya.ConfigQuery;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.spi.ConfigurationContext;
-
+import javax.config.Config;
+import javax.config.spi.ConfigSource;
 import java.util.*;
 
 /**
  * Combines a set of child configurations to a new one, by overriding the first entries with result from
  * later instances.
  */
-class CombinedConfiguration implements Configuration{
+class CombinedConfiguration implements Config{
     /** The name of the new configuration. */
     private final String name;
 
@@ -38,85 +34,48 @@ class CombinedConfiguration implements Configuration{
      * The configuration's in evaluation order. Instances with higher indices
      * override results with lower ones.
      */
-    private final ArrayList<Configuration> configurations = new ArrayList<>();
+    private final ArrayList<Config> configurations = new ArrayList<>();
 
     /**
      * Creates a combined configuration instance.
      * @param configName the name of the new config.
      * @param configs the configurations hereby instances with higher indices override results with lower ones.
      */
-    public CombinedConfiguration(String configName, Configuration... configs) {
+    public CombinedConfiguration(String configName, Config... configs) {
         this.name = configName;
 
         if (null != configs) {
-            for (Configuration config : configs) {
+            for (Config config : configs) {
                 if (config == null) {
                     continue;
                 }
-
-                addConfiguration(config);
+                configurations.add(config);
             }
         }
     }
 
 
     @Override
-    public String get(String key) {
-        String curValue = null;
-        for(Configuration config: getConfigurations()){
-            String value = config.get(key);
-            if(value!=null){
-                curValue = value;
+    public <T> T getValue(String key, Class<T> type) {
+        T curValue = null;
+        for(Config config: configurations){
+            Optional<T> value = config.getOptionalValue(key, type);
+            if(value.isPresent()){
+                curValue = value.get();
             }
         }
         return curValue;
     }
 
     @Override
-    public String getOrDefault(String key, String defaultValue) {
+    public <T> Optional<T> getOptionalValue(String key, Class<T> type) {
         Objects.requireNonNull(key, "Key must be given.");
-        Objects.requireNonNull(defaultValue, "Value must be given.");
-
-        String val = get(key);
-
-        if (val == null) {
-            return defaultValue;
-        }
-
-        return val;
-    }
-
-    @Override
-    public <T> T getOrDefault(String key, Class<T> type, T defaultValue) {
         Objects.requireNonNull(type, "Type must be given.");
-        Objects.requireNonNull(key, "Key must be given.");
-        Objects.requireNonNull(defaultValue, "Default value must be given.");
-
-        T val = get(key, type);
-        if(val==null){
-            return defaultValue;
-        }
-        return val;
-    }
-
-    @Override
-    public <T> T get(String key, Class<T> type) {
-        T curValue = null;
-        for(Configuration config: getConfigurations()){
-            T value = config.get(key, type);
-            if(value!=null){
-                curValue = value;
-            }
-        }
-        return curValue;
-    }
 
-    @Override
-    public <T> T get(String key, TypeLiteral<T> type) {
-        T curValue = null;
-        for(Configuration config: getConfigurations()){
-            T value = config.get(key, type);
-            if(value!=null){
+        Optional<T> curValue = Optional.empty();
+        for(Config config: configurations){
+            Optional<T> value = config.getOptionalValue(key, type);
+            if(value!=null && value.isPresent()){
                 curValue = value;
             }
         }
@@ -124,45 +83,21 @@ class CombinedConfiguration implements Configuration{
     }
 
     @Override
-    public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) {
-        Objects.requireNonNull(key, "Key must be given.");
-        Objects.requireNonNull(type, "Type must be given.");
-        Objects.requireNonNull(defaultValue, "Default value must be given.");
-
-        T val = get(key, type);
-        if(val==null){
-            return defaultValue;
-        }
-        return val;
-    }
-
-    @Override
-    public Map<String, String> getProperties() {
-        Map<String, String> result = new HashMap<>();
-        for(Configuration ps : getConfigurations()){
-            result.putAll(ps.getProperties());
+    public Iterable<String> getPropertyNames() {
+        Set<String> result = new HashSet<>();
+        for(Config ps : configurations){
+            ps.getPropertyNames().forEach(result::add);
         }
         return result;
     }
 
     @Override
-    public Configuration with(ConfigOperator operator) {
-        Objects.requireNonNull(operator, "Operator must be given.");
-
-        return operator.operate(this);
-    }
-
-    @Override
-    public <T> T query(ConfigQuery<T> query) {
-        Objects.requireNonNull(query, "Query must be given.");
-
-        return query.query(this);
-    }
-
-    @Override
-    public ConfigurationContext getContext() {
-        // TODO thjink on combining the participating contexts...
-        return configurations.get(0).getContext();
+    public Iterable<ConfigSource> getConfigSources() {
+        List<ConfigSource> configSources = new ArrayList<>();
+        for(Config ps : configurations){
+            ps.getConfigSources().forEach(configSources::add);
+        }
+        return configSources;
     }
 
     @Override
@@ -173,13 +108,4 @@ class CombinedConfiguration implements Configuration{
                 '}';
     }
 
-    protected void addConfiguration(Configuration config) {
-        configurations.add(config);
-    }
-
-    protected List<Configuration> getConfigurations() {
-        return configurations;
-    }
-
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingConfigSource.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingConfigSource.java b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingConfigSource.java
new file mode 100644
index 0000000..3461ed4
--- /dev/null
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingConfigSource.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tamaya.functions;
+
+import javax.config.Config;
+import javax.config.spi.ConfigSource;
+import java.util.*;
+
+/**
+ * PropertySource that wraps a Configuration instance.
+ */
+final class ConfigWrappingConfigSource implements ConfigSource {
+    /** The property source name. */
+    private final String name;
+    /** The ordinal. */
+    private final int ordinal;
+    /** The wrapped config. */
+    private final Config config;
+
+    /**
+     * Constructor.
+     * @param name the property source name, not null.
+     * @param ordinal ths ordinal
+     * @param config the wrapped config, not null.
+     */
+    public ConfigWrappingConfigSource(String name, int ordinal, Config config){
+        this.name = Objects.requireNonNull(name);
+        this.ordinal = ordinal;
+        this.config = Objects.requireNonNull(config);
+    }
+
+    public int getOrdinal() {
+        return ordinal;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getValue(String key) {
+        return config.getOptionalValue(key, String.class).orElse(null);
+    }
+
+    @Override
+    public Map<String,String> getProperties() {
+        Map<String,String> result = new HashMap<>();
+        config.getPropertyNames().forEach(key -> result.put(key, config.getValue(key, String.class)));
+        return result;
+    }
+
+    @Override
+    public String toString(){
+        return "ConfigWrappingPropertySource(name="+name+", ordinal="+ordinal+", config="+config+")";
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java
deleted file mode 100644
index dbad205..0000000
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigWrappingPropertySource.java
+++ /dev/null
@@ -1,84 +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.functions;
-
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spi.PropertyValue;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * PropertySource that wraps a Configuration instance.
- */
-final class ConfigWrappingPropertySource implements PropertySource {
-    /** The property source name. */
-    private final String name;
-    /** The ordinal. */
-    private final int ordinal;
-    /** The wrapped config. */
-    private final Configuration config;
-
-    /**
-     * Constructor.
-     * @param name the property source name, not null.
-     * @param ordinal ths ordinal
-     * @param config the wrapped config, not null.
-     */
-    public ConfigWrappingPropertySource(String name, int ordinal, Configuration config){
-        this.name = Objects.requireNonNull(name);
-        this.ordinal = ordinal;
-        this.config = Objects.requireNonNull(config);
-    }
-
-    public int getOrdinal() {
-        return ordinal;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    @Override
-    public PropertyValue get(String key) {
-        return PropertyValue.of(key, config.get(key), getName());
-    }
-
-    @Override
-    public Map<String, PropertyValue> getProperties() {
-        Map<String,PropertyValue> result = new HashMap<>();
-        for(Map.Entry<String,String> en:config.getProperties().entrySet()){
-            result.put(en.getKey(), PropertyValue.of(en.getKey(), en.getValue(), getName()));
-        }
-        return result;
-    }
-
-    @Override
-    public boolean isScannable() {
-        return true;
-    }
-
-    @Override
-    public String toString(){
-        return "ConfigWrappingPropertySource(name="+name+", ordinal="+ordinal+", config="+config+")";
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigurationFunctions.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigurationFunctions.java b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigurationFunctions.java
index ccb6396..76581b7 100644
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigurationFunctions.java
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/ConfigurationFunctions.java
@@ -18,26 +18,12 @@
  */
 package org.apache.tamaya.functions;
 
-import org.apache.tamaya.ConfigOperator;
-import org.apache.tamaya.ConfigQuery;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.spi.ConfigurationContext;
-import org.apache.tamaya.spi.ConfigurationContextBuilder;
-import org.apache.tamaya.spi.PropertyConverter;
-import org.apache.tamaya.spi.PropertyFilter;
-import org.apache.tamaya.spi.PropertySource;
-import org.apache.tamaya.spi.PropertyValueCombinationPolicy;
-
+import javax.config.Config;
+import javax.config.spi.ConfigSource;
 import java.net.Inet4Address;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
+import java.util.*;
+import java.util.function.Function;
+import java.util.function.UnaryOperator;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -54,56 +40,26 @@ public final class ConfigurationFunctions {
     /**
      * Implementation of an empty propertySource.
      */
-    private static final Configuration EMPTY_CONFIGURATION = new Configuration() {
-
-        @Override
-        public String get(String key) {
-            return null;
-        }
-
-        @Override
-        public String getOrDefault(String key, String defaultValue) {
-            return defaultValue;
-        }
-
-        @Override
-        public <T> T getOrDefault(String key, Class<T> type, T defaultValue) {
-            return defaultValue;
-        }
+    private static final Config EMPTY_CONFIGURATION = new Config() {
 
         @Override
-        public <T> T get(String key, Class<T> type) {
+        public <T> T getValue(String key, Class<T> type) {
             return null;
         }
 
         @Override
-        public <T> T get(String key, TypeLiteral<T> type) {
-            return null;
-        }
-
-        @Override
-        public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) {
-            return defaultValue;
+        public <T> Optional<T> getOptionalValue(String key, Class<T> type) {
+            return Optional.empty();
         }
 
         @Override
-        public Map<String, String> getProperties() {
-            return Collections.emptyMap();
+        public Iterable<String> getPropertyNames() {
+            return Collections.emptySet();
         }
 
         @Override
-        public Configuration with(ConfigOperator operator) {
-            return operator.operate(this);
-        }
-
-        @Override
-        public <T> T query(ConfigQuery<T> query) {
-            return query.query(this);
-        }
-
-        @Override
-        public ConfigurationContext getContext() {
-            return EMPTY_CONFIGURATION_CONTEXT;
+        public Iterable<ConfigSource> getConfigSources() {
+            return Collections.emptySet();
         }
 
         @Override
@@ -112,58 +68,6 @@ public final class ConfigurationFunctions {
         }
     };
 
-    private static final ConfigurationContext EMPTY_CONFIGURATION_CONTEXT = new ConfigurationContext() {
-        @Override
-        public void addPropertySources(PropertySource... propertySourcesToAdd) {
-            // ignore
-        }
-
-        @Override
-        public List<PropertySource> getPropertySources() {
-            return Collections.emptyList();
-        }
-
-        @Override
-        public PropertySource getPropertySource(String name) {
-            return null;
-        }
-
-        @Override
-        public <T> void addPropertyConverter(TypeLiteral<T> typeToConvert, PropertyConverter<T> propertyConverter) {
-            // ignore
-        }
-
-        @Override
-        public Map<TypeLiteral<?>, List<PropertyConverter<?>>> getPropertyConverters() {
-            return Collections.emptyMap();
-        }
-
-        @Override
-        public <T> List<PropertyConverter<T>> getPropertyConverters(TypeLiteral<T> type) {
-            return Collections.emptyList();
-        }
-
-        @Override
-        public List<PropertyFilter> getPropertyFilters() {
-            return Collections.emptyList();
-        }
-
-        @Override
-        public PropertyValueCombinationPolicy getPropertyValueCombinationPolicy() {
-            return PropertyValueCombinationPolicy.DEFAULT_OVERRIDING_COLLECTOR;
-        }
-
-        @Override
-        public ConfigurationContextBuilder toBuilder() {
-            throw new UnsupportedOperationException("Cannot build from ConfigurationContext.EMPTY.");
-        }
-
-        @Override
-        public String toString(){
-            return "ConfigurationContext.EMPTY";
-        }
-    };
-
     /**
      * Private singleton constructor.
      */
@@ -177,13 +81,8 @@ public final class ConfigurationFunctions {
      * @param filter the filter, not null
      * @return the section configuration, with the areaKey stripped away.
      */
-    public static ConfigOperator filter(final PropertyMatcher filter) {
-        return new ConfigOperator() {
-            @Override
-            public Configuration operate(Configuration config) {
-                return new FilteredConfiguration(config, filter, "FilterClass: " + filter.getClass().getName());
-            }
-        };
+    public static UnaryOperator<Config> filter(final PropertyMatcher filter) {
+        return config -> new FilteredConfiguration(config, filter, "FilterClass: " + filter.getClass().getName());
     }
 
     /**
@@ -193,13 +92,8 @@ public final class ConfigurationFunctions {
      * @param keyMapper the keyMapper, not null
      * @return the section configuration, with the areaKey stripped away.
      */
-    public static ConfigOperator map(final KeyMapper keyMapper) {
-        return new ConfigOperator() {
-            @Override
-            public Configuration operate(Configuration config) {
-                return new MappedConfiguration(config, keyMapper, null);
-            }
-        };
+    public static UnaryOperator<Config> map(final KeyMapper keyMapper) {
+        return config -> new MappedConfiguration(config, keyMapper, null);
     }
 
     /**
@@ -210,7 +104,7 @@ public final class ConfigurationFunctions {
      * @param areaKey the section key, not null
      * @return the section configuration, with the areaKey stripped away.
      */
-    public static ConfigOperator section(String areaKey) {
+    public static UnaryOperator<Config> section(String areaKey) {
         return section(areaKey, false);
     }
 
@@ -222,30 +116,24 @@ public final class ConfigurationFunctions {
      * @param stripKeys if set to true, the section key is stripped away fromMap the resulting key.
      * @return the section configuration, with the areaKey stripped away.
      */
-    public static ConfigOperator section(final String areaKey, final boolean stripKeys) {
-        return new ConfigOperator() {
-            @Override
-            public Configuration operate(Configuration config) {
-                Configuration filtered = new FilteredConfiguration(config,
-                        new PropertyMatcher() {
-                            @Override
-                            public boolean test(String k, String v) {
-                                return isKeyInSection(k, areaKey);
-                            }
-                        }, "section: " + areaKey);
+    public static UnaryOperator<Config> section(final String areaKey, final boolean stripKeys) {
+        return config -> {
+                Config filtered = new FilteredConfiguration(
+                        config,
+                        (k, v) -> isKeyInSection(k, areaKey),
+                        "section: " + areaKey);
                 if (stripKeys) {
-                    return new MappedConfiguration(filtered, new KeyMapper(){
-                        @Override
-                        public String mapKey(String key) {
-                            if(key.startsWith(areaKey)) {
-                                return key.substring(areaKey.length());
-                            }
-                            return areaKey + key;
-                        }
-                    }, "stripped");
+                    return new MappedConfiguration(
+                            filtered,
+                            key -> {
+                                if(key.startsWith(areaKey)) {
+                                    return key.substring(areaKey.length());
+                                }
+                                return areaKey + key;
+                            },
+                            "stripped");
                 }
                 return filtered;
-            }
         };
     }
 
@@ -283,19 +171,16 @@ public final class ConfigurationFunctions {
      *
      * @return s set with all sections, never {@code null}.
      */
-    public static ConfigQuery<Set<String>> sections() {
-        return new ConfigQuery<Set<String>>() {
-            @Override
-            public Set<String> query(Configuration config) {
+    public static Function<Config,Set<String>> sections() {
+        return config -> {
                 final Set<String> areas = new TreeSet<>();
-                for (String s : config.getProperties().keySet()) {
+                for (String s : config.getPropertyNames()) {
                     int index = s.lastIndexOf('.');
                     if (index > 0) {
                         areas.add(s.substring(0, index));
                     }
                 }
                 return areas;
-            }
         };
     }
 
@@ -307,12 +192,10 @@ public final class ConfigurationFunctions {
      *
      * @return s set with all transitive sections, never {@code null}.
      */
-    public static ConfigQuery<Set<String>> transitiveSections() {
-        return new ConfigQuery<Set<String>>() {
-            @Override
-            public Set<String> query(Configuration config) {
+    public static Function<Config,Set<String>> transitiveSections() {
+        return config -> {
                 final Set<String> transitiveAreas = new TreeSet<>();
-                for (String s : config.query(sections())) {
+                for (String s : sections().apply(config)) {
                     transitiveAreas.add(s);
                     int index = s.lastIndexOf('.');
                     while (index > 0) {
@@ -322,7 +205,6 @@ public final class ConfigurationFunctions {
                     }
                 }
                 return transitiveAreas;
-            }
         };
     }
 
@@ -335,20 +217,16 @@ public final class ConfigurationFunctions {
      * @param predicate A predicate to deternine, which sections should be returned, not {@code null}.
      * @return s set with all sections, never {@code null}.
      */
-    public static ConfigQuery<Set<String>> sections(final Predicate<String> predicate) {
-        return new ConfigQuery<Set<String>>() {
-            @Override
-            public Set<String> query(Configuration config) {
+    public static Function<Config,Set<String>> sections(final Predicate<String> predicate) {
+        return config -> {
                 Set<String> result = new TreeSet<>();
-                for (String s : sections().query(config)) {
+                for (String s : sections().apply(config)) {
                     if (predicate.test(s)) {
                         result.add(s);
                     }
                 }
                 return result;
-            }
         };
-
     }
 
     /**
@@ -360,18 +238,15 @@ public final class ConfigurationFunctions {
      * @param predicate A predicate to deternine, which sections should be returned, not {@code null}.
      * @return s set with all transitive sections, never {@code null}.
      */
-    public static ConfigQuery<Set<String>> transitiveSections(final Predicate<String> predicate) {
-        return new ConfigQuery<Set<String>>() {
-            @Override
-            public Set<String> query(Configuration config) {
+    public static Function<Config,Set<String>> transitiveSections(final Predicate<String> predicate) {
+        return config -> {
                 Set<String> result = new TreeSet<>();
-                for (String s : transitiveSections().query(config)) {
+                for (String s : transitiveSections().apply(config)) {
                     if (predicate.test(s)) {
                         result.add(s);
                     }
                 }
                 return result;
-            }
         };
     }
 
@@ -382,7 +257,7 @@ public final class ConfigurationFunctions {
      * @param sectionKeys the section keys, not null
      * @return the section configuration, with the areaKey stripped away.
      */
-    public static ConfigOperator sectionsRecursive(String... sectionKeys) {
+    public static UnaryOperator<Config> sectionsRecursive(String... sectionKeys) {
         return sectionRecursive(false, sectionKeys);
     }
 
@@ -395,20 +270,20 @@ public final class ConfigurationFunctions {
      *                   by entries of the later instances.
      * @return the resulting configuration instance.
      */
-    public static Configuration combine(String configName, Configuration... configs) {
+    public static Config combine(String configName, Config... configs) {
         return new CombinedConfiguration(configName, configs);
     }
 
     /**
-     * Creates a {@link PropertySource}, based on the given {@link Configuration}. The keys and propertx map
+     * Creates a {@link ConfigSource}, based on the given {@link Config}. The keys and propertx map
      * are dynamically calculated, so the returned PropertySource is a real dynamic wrapper.
      * @param name the name of the property source, not null.
      * @param ordinal ordinal of the property source.
      * @param config the config to be mapped, not null.
      * @return a property source wrapping the configuration.
      */
-    public static PropertySource propertySourceFrom(final String name, final int ordinal, final Configuration config){
-        return new ConfigWrappingPropertySource(name, ordinal, config);
+    public static ConfigSource propertySourceFrom(final String name, final int ordinal, final Config config){
+        return new ConfigWrappingConfigSource(name, ordinal, config);
     }
 
     /**
@@ -419,26 +294,19 @@ public final class ConfigurationFunctions {
      * @param stripKeys   if set to true, the section key is stripped away fromMap the resulting key.
      * @return the section configuration, with the areaKey stripped away.
      */
-    public static ConfigOperator sectionRecursive(final boolean stripKeys, final String... sectionKeys) {
-        return new ConfigOperator() {
-            @Override
-            public Configuration operate(Configuration config) {
-                Configuration filtered = new FilteredConfiguration(config, new PropertyMatcher() {
-                    @Override
-                    public boolean test(final String k, String v) {
-                        return isKeyInSections(k, sectionKeys);
-                    }
-                }, "sections: " + Arrays.toString(sectionKeys));
-                if (stripKeys) {
-                    return new MappedConfiguration(filtered, new KeyMapper() {
-                        @Override
-                        public String mapKey(String key) {
-                            return PropertySourceFunctions.stripSectionKeys(key, sectionKeys);
-                        }
-                    }, "stripped");
-                }
-                return filtered;
+    public static UnaryOperator<Config> sectionRecursive(final boolean stripKeys, final String... sectionKeys) {
+        return (config) -> {
+            Config filtered = new FilteredConfiguration(
+                    config,
+                    (k,v) -> isKeyInSections(k, sectionKeys),
+                    "sections: " + Arrays.toString(sectionKeys));
+            if (stripKeys) {
+                return new MappedConfiguration(
+                        filtered,
+                        k -> PropertySourceFunctions.stripSectionKeys(k, sectionKeys),
+                        "stripped");
             }
+            return filtered;
         };
     }
 
@@ -447,7 +315,7 @@ public final class ConfigurationFunctions {
      *
      * @return the given query.
      */
-    public static ConfigQuery<String> jsonInfo() {
+    public static Function<Config,String> jsonInfo() {
         return jsonInfo(null);
     }
 
@@ -458,29 +326,27 @@ public final class ConfigurationFunctions {
      *             parameters.
      * @return the given query.
      */
-    public static ConfigQuery<String> jsonInfo(final Map<String, String> info) {
-        return new ConfigQuery<String>() {
-            @Override
-            public String query(Configuration config) {
-                Map<String, String> props = new TreeMap<>(config.getProperties());
-                props.put("__timestamp", String.valueOf(System.currentTimeMillis()));
-                if(info!=null) {
-                    for (Map.Entry<String, String> en : info.entrySet()) {
-                        props.put("__" + escape(en.getKey()), escape(en.getValue()));
-                    }
+    public static Function<Config,String> jsonInfo(final Map<String, String> info) {
+        return config -> {
+            Map<String, String> props = new TreeMap<>();
+            config.getPropertyNames().forEach(key -> props.put(key, config.getValue(key, String.class)));
+            props.put("__timestamp", String.valueOf(System.currentTimeMillis()));
+            if(info!=null) {
+                for (Map.Entry<String, String> en : info.entrySet()) {
+                    props.put("__" + escape(en.getKey()), escape(en.getValue()));
                 }
-                StringBuilder builder = new StringBuilder(400).append("{\n");
-                for (Map.Entry<String, String> en : props.entrySet()) {
-                    builder.append("  \"").append(escape(en.getKey())).append("\": \"" )
-                            .append(escape(en.getValue())).append("\",\n");
-                }
-                if(builder.toString().endsWith(",\n")){
-                    builder.setLength(builder.length()-2);
-                    builder.append('\n');
-                }
-                builder.append("}\n");
-                return builder.toString();
             }
+            StringBuilder builder = new StringBuilder(400).append("{\n");
+            for (Map.Entry<String, String> en : props.entrySet()) {
+                builder.append("  \"").append(escape(en.getKey())).append("\": \"" )
+                        .append(escape(en.getValue())).append("\",\n");
+            }
+            if(builder.toString().endsWith(",\n")){
+                builder.setLength(builder.length()-2);
+                builder.append('\n');
+            }
+            builder.append("}\n");
+            return builder.toString();
         };
     }
 
@@ -489,7 +355,7 @@ public final class ConfigurationFunctions {
      *
      * @return the given query.
      */
-    public static ConfigQuery<String> xmlInfo() {
+    public static Function<Config,String> xmlInfo() {
         return xmlInfo(null);
     }
 
@@ -500,25 +366,23 @@ public final class ConfigurationFunctions {
      *             parameters.
      * @return the given query.
      */
-    public static ConfigQuery<String> xmlInfo(final Map<String, String> info) {
-        return new ConfigQuery<String>() {
-            @Override
-            public String query(Configuration config) {
-                Map<String, String> props = new TreeMap<>(config.getProperties());
-                props.put("__timestamp", String.valueOf(System.currentTimeMillis()));
-                if(info!=null) {
-                    for (Map.Entry<String, String> en : info.entrySet()) {
-                        props.put("__" + escape(en.getKey()), escape(en.getValue()));
-                    }
-                }
-                StringBuilder builder = new StringBuilder(400);
-                builder.append("<configuration>\n");
-                for (Map.Entry<String, String> en : props.entrySet()) {
-                    builder.append("  <entry key=\"" + escape(en.getKey()) + "\">" + escape(en.getValue()) + "</entry>\n");
+    public static Function<Config,String> xmlInfo(final Map<String, String> info) {
+        return config -> {
+            Map<String, String> props = new TreeMap<>();
+            config.getPropertyNames().forEach(key -> props.put(key, config.getValue(key, String.class)));
+            props.put("__timestamp", String.valueOf(System.currentTimeMillis()));
+            if(info!=null) {
+                for (Map.Entry<String, String> en : info.entrySet()) {
+                    props.put("__" + escape(en.getKey()), escape(en.getValue()));
                 }
-                builder.append("</configuration>\n");
-                return builder.toString();
             }
+            StringBuilder builder = new StringBuilder(400);
+            builder.append("<configuration>\n");
+            for (Map.Entry<String, String> en : props.entrySet()) {
+                builder.append("  <entry key=\"" + escape(en.getKey()) + "\">" + escape(en.getValue()) + "</entry>\n");
+            }
+            builder.append("</configuration>\n");
+            return builder.toString();
         };
     }
 
@@ -527,7 +391,7 @@ public final class ConfigurationFunctions {
      *
      * @return the given query.
      */
-    public static ConfigQuery<String> textInfo() {
+    public static Function<Config,String> textInfo() {
         return textInfo(null);
     }
 
@@ -536,27 +400,25 @@ public final class ConfigurationFunctions {
      * @param info configuration values to use for filtering.
      * @return the given query.
      */
-    public static ConfigQuery<String> textInfo(final Map<String, String> info) {
-        return new ConfigQuery<String>() {
-            @Override
-            public String query(Configuration config) {
-                Map<String, String> props = new TreeMap<>(config.getProperties());
-                props.put("__timestamp", String.valueOf(System.currentTimeMillis()));
-                if(info!=null) {
-                    for (Map.Entry<String, String> en : info.entrySet()) {
-                        props.put("__" + escape(en.getKey()), escape(en.getValue()));
-                    }
+    public static Function<Config,String> textInfo(final Map<String, String> info) {
+        return config -> {
+            Map<String, String> props = new TreeMap<>();
+            config.getPropertyNames().forEach(key -> props.put(key, config.getValue(key, String.class)));
+            props.put("__timestamp", String.valueOf(System.currentTimeMillis()));
+            if(info!=null) {
+                for (Map.Entry<String, String> en : info.entrySet()) {
+                    props.put("__" + escape(en.getKey()), escape(en.getValue()));
                 }
-                StringBuilder builder = new StringBuilder(400).append("Configuration:\n");
-                for (Map.Entry<String, String> en : props.entrySet()) {
-                    builder.append("  " + escape(en.getKey()) + ": " + escape(en.getValue()).replace("\n", "\n     ") + ",\n");
-                }
-                if(builder.toString().endsWith(",\n")){
-                    builder.setLength(builder.length() - 2);
-                }
-                builder.append("\n");
-                return builder.toString();
             }
+            StringBuilder builder = new StringBuilder(400).append("Configuration:\n");
+            for (Map.Entry<String, String> en : props.entrySet()) {
+                builder.append("  " + escape(en.getKey()) + ": " + escape(en.getValue()).replace("\n", "\n     ") + ",\n");
+            }
+            if(builder.toString().endsWith(",\n")){
+                builder.setLength(builder.length() - 2);
+            }
+            builder.append("\n");
+            return builder.toString();
         };
     }
 
@@ -566,13 +428,8 @@ public final class ConfigurationFunctions {
      * @param override if true, all items existing are overridden by the new ones passed.
      * @return the ConfigOperator, never null.
      */
-    public static ConfigOperator addItems(final Map<String,Object> items, final boolean override){
-        return new ConfigOperator() {
-            @Override
-            public Configuration operate(Configuration config) {
-                return new EnrichedConfiguration(config,items, override);
-            }
-        };
+    public static UnaryOperator<Config> addItems(final Map<String,Object> items, final boolean override){
+        return config -> new EnrichedConfiguration(config,items, override);
     }
 
     /**
@@ -580,7 +437,7 @@ public final class ConfigurationFunctions {
      * @param items the items, not null.
      * @return the operator, never null.
      */
-    public static ConfigOperator addItems(Map<String,Object> items){
+    public static UnaryOperator<Config> addItems(Map<String,Object> items){
         return addItems(items, false);
     }
 
@@ -589,7 +446,7 @@ public final class ConfigurationFunctions {
      * @param items the items.
      * @return the operator for replacing the items.
      */
-    public static ConfigOperator replaceItems(Map<String,Object> items){
+    public static UnaryOperator<Config> replaceItems(Map<String,Object> items){
         return addItems(items, true);
     }
 
@@ -598,7 +455,7 @@ public final class ConfigurationFunctions {
      *
      * @return the given query.
      */
-    public static ConfigQuery<String> htmlInfo() {
+    public static Function<Config,String> htmlInfo() {
         return htmlInfo(null);
     }
 
@@ -607,16 +464,13 @@ public final class ConfigurationFunctions {
      * @param info configuration values to use for filtering.
      * @return the given query.
      */
-    public static ConfigQuery<String> htmlInfo(final Map<String, String> info) {
-        return new ConfigQuery<String>() {
-            @Override
-            public String query(Configuration config) {
-                StringBuilder builder = new StringBuilder();
-                addHeader(builder);
-                builder.append("<pre>\n").append(textInfo(info).query(config)).append("</pre>\n");
-                addFooter(builder);
-                return builder.toString();
-            }
+    public static Function<Config,String> htmlInfo(final Map<String, String> info) {
+        return config -> {
+            StringBuilder builder = new StringBuilder();
+            addHeader(builder);
+            builder.append("<pre>\n").append(textInfo(info).apply(config)).append("</pre>\n");
+            addFooter(builder);
+            return builder.toString();
         };
     }
 
@@ -649,19 +503,12 @@ public final class ConfigurationFunctions {
     }
 
     /**
-     * Accesses an empty {@link Configuration}.
-     * @return an empty {@link Configuration}, never null.
+     * Accesses an empty {@link Config}.
+     * @return an empty {@link Config}, never null.
      */
-    public static Configuration emptyConfiguration(){
+    public static Config emptyConfig(){
         return EMPTY_CONFIGURATION;
     }
 
-    /**
-     * Accesses an empty {@link ConfigurationContext}.
-     * @return an empty {@link ConfigurationContext}, never null.
-     */
-    public static ConfigurationContext emptyConfigurationContext(){
-        return EMPTY_CONFIGURATION_CONTEXT;
-    }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java
index a223a45..0a9c549 100644
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/EnrichedConfiguration.java
@@ -18,22 +18,16 @@
  */
 package org.apache.tamaya.functions;
 
-import org.apache.tamaya.ConfigOperator;
-import org.apache.tamaya.ConfigQuery;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.spi.ConfigurationContext;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import javax.config.Config;
+import javax.config.spi.ConfigSource;
+import java.util.*;
 
 /**
  * Configuration, that has values added or overridden.
  */
-class EnrichedConfiguration implements Configuration {
+class EnrichedConfiguration implements Config {
 
-    private final Configuration baseConfiguration;
+    private final Config baseConfiguration;
 
     private final Map<String, Object> addedProperties = new HashMap<>();
 
@@ -46,127 +40,59 @@ class EnrichedConfiguration implements Configuration {
      * @param properties the properties to be added, not null.
      * @param overriding true, if existing keys should be overriden, or config should be extended only.
      */
-    EnrichedConfiguration(Configuration configuration, Map<String, Object> properties, boolean overriding) {
+    EnrichedConfiguration(Config configuration, Map<String, Object> properties, boolean overriding) {
         this.baseConfiguration = Objects.requireNonNull(configuration);
         this.addedProperties.putAll(properties);
         this.overriding = overriding;
     }
 
     @Override
-    public String get(String key) {
-        Objects.requireNonNull(key, "Key must be given.");
-
-        if (overriding) {
-            Object val = addedProperties.get(key);
-            if (val != null) {
-                return val.toString();
-            }
-            return baseConfiguration.get(key);
-        }
-        String val = baseConfiguration.get(key);
-        if (val != null) {
-            return val;
-        }
-        Object val2 = addedProperties.get(key);
-        if (val2 != null) {
-            return val2.toString();
-        }
-        return null;
+    public <T> T getValue(String key, Class<T> type) {
+        return getOptionalValue(key, type).orElse(null);
     }
 
     @Override
-    public String getOrDefault(String key, String defaultValue) {
+    public <T> Optional<T> getOptionalValue(String key, Class<T> type) {
         Objects.requireNonNull(key, "Key must be given.");
-        Objects.requireNonNull(defaultValue, "Default value must be given.");
-
-        String val = get(key);
-        if (val == null) {
-            return defaultValue;
-        }
-        return val;
-    }
-
-    @Override
-    public <T> T getOrDefault(String key, Class<T> type, T defaultValue) {
-        Objects.requireNonNull(key, "Key not given.");
-        Objects.requireNonNull(type, "Class not given.");
-        Objects.requireNonNull(defaultValue, "Default value not given.");
-
-        T val = get(key, type);
-        if (val == null) {
-            return defaultValue;
-        }
-        return val;
-    }
-
-    @Override
-    public <T> T get(String key, Class<T> type) {
-        return (T) get(key, TypeLiteral.of(type));
-    }
-
-    @Override
-    public <T> T get(String key, TypeLiteral<T> type) {
+        Objects.requireNonNull(type, "Type must be given.");
         if (overriding) {
             Object val = addedProperties.get(key);
-            if (val != null && type.getRawType().isAssignableFrom(val.getClass())) {
-                return (T) val;
+            if (val != null){
+                if(type.isAssignableFrom(type)){
+                    return Optional.of((T)val);
+                }else if(type == String.class) {
+                    return Optional.of((T)val.toString());
+                }
+                return baseConfiguration.getOptionalValue(key, type);
             }
-            return baseConfiguration.get(key, type);
         }
-        T val = baseConfiguration.get(key, type);
-        if (val != null) {
+        Optional<T> val = baseConfiguration.getOptionalValue(key, type);
+        if (val !=null && val.isPresent()) {
             return val;
         }
         Object val2 = addedProperties.get(key);
-        if (val2 != null && type.getRawType().isAssignableFrom(val2.getClass())) {
-            return (T) val2;
-        }
-        return null;
-    }
-
-    @Override
-    public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) {
-        Objects.requireNonNull(key, "Key not given.");
-        Objects.requireNonNull(type, "Type not given.");
-        Objects.requireNonNull(defaultValue, "Default value not given.");
-
-        T val = get(key, type);
-        if (val == null) {
-            return defaultValue;
-        }
-        return val;
-    }
-
-    @Override
-    public Map<String, String> getProperties() {
-        Map<String, String> allProps = new HashMap<>();
-        if (overriding) {
-            allProps.putAll(baseConfiguration.getProperties());
-            for (Map.Entry<String, Object> en : addedProperties.entrySet()) {
-                allProps.put(en.getKey(), en.getValue().toString());
-            }
-        } else {
-            for (Map.Entry<String, Object> en : addedProperties.entrySet()) {
-                allProps.put(en.getKey(), en.getValue().toString());
+        if (val2 != null){
+            if(type.isAssignableFrom(val2.getClass())) {
+                return Optional.of((T) val2);
+            }else if(type == String.class) {
+                return Optional.of((T)val2.toString());
             }
-            allProps.putAll(baseConfiguration.getProperties());
         }
-        return allProps;
+        return Optional.empty();
     }
 
-    @Override
-    public Configuration with(ConfigOperator operator) {
-        return operator.operate(this);
-    }
 
     @Override
-    public <T> T query(ConfigQuery<T> query) {
-        return query.query(this);
+    public Iterable<String> getPropertyNames() {
+        Set<String> allKeys = new HashSet<>();
+        baseConfiguration.getPropertyNames().forEach(allKeys::add);
+        addedProperties.keySet().forEach(allKeys::add);
+        return allKeys;
     }
 
     @Override
-    public ConfigurationContext getContext() {
-        return baseConfiguration.getContext();
+    public Iterable<ConfigSource> getConfigSources() {
+        return baseConfiguration.getConfigSources();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java
index e8acaaa..b61c730 100644
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/FilteredConfiguration.java
@@ -18,101 +18,57 @@
  */
 package org.apache.tamaya.functions;
 
-import org.apache.tamaya.ConfigOperator;
-import org.apache.tamaya.ConfigQuery;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.spi.ConfigurationContext;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import javax.config.Config;
+import javax.config.spi.ConfigSource;
+import java.util.*;
 
 /**
  * Configuration that filters part of the entries defined by a matcher predicate.
  */
-class FilteredConfiguration implements Configuration {
+class FilteredConfiguration implements Config {
 
-    private final Configuration baseConfiguration;
+    private final Config baseConfiguration;
     private final PropertyMatcher matcher;
     private final String filterType;
 
-    FilteredConfiguration(Configuration baseConfiguration, PropertyMatcher matcher, String filterType) {
+    FilteredConfiguration(Config baseConfiguration, PropertyMatcher matcher, String filterType) {
         this.baseConfiguration = Objects.requireNonNull(baseConfiguration);
         this.matcher = Objects.requireNonNull(matcher);
         this.filterType = filterType!=null?filterType:this.matcher.toString();
     }
 
     @Override
-    public String get(String key) {
-        return get(key, String.class);
-    }
-
-    @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) {
-        return (T)get(key, TypeLiteral.of(type));
-    }
-
-    @Override
-    public <T> T get(String key, TypeLiteral<T> type) {
-        String value = baseConfiguration.get(key);
-        if (matcher.test(key, value)) {
-            return baseConfiguration.get(key, type);
+    public <T> T getValue(String key, Class<T> type) {
+        String stringValue = baseConfiguration.getValue(key, String.class);
+        if (matcher.test(key, stringValue)) {
+            return baseConfiguration.getValue(key, type);
         }
         return null;
     }
 
     @Override
-    public <T> T getOrDefault(String key, TypeLiteral<T> type, T defaultValue) {
-        T val = get(key, type);
-        if(val==null){
-            return defaultValue;
+    public <T> Optional<T> getOptionalValue(String key, Class<T> type) {
+        Optional<String> value = baseConfiguration.getOptionalValue(key, String.class);
+        if(value.isPresent() && matcher.test(key, value.get())) {
+            return baseConfiguration.getOptionalValue(key, type);
         }
-        return val;
+        return Optional.empty();
     }
 
     @Override
-    public Map<String, String> getProperties() {
-        Map<String, String> result = new HashMap<>();
-        for(Map.Entry<String,String> en:baseConfiguration.getProperties().entrySet()){
-            if(matcher.test(en.getKey(), en.getValue())){
-                result.put(en.getKey(), en.getValue());
+    public Iterable<String> getPropertyNames() {
+        Set<String> result = new HashSet<>();
+        for(String name:baseConfiguration.getPropertyNames()){
+            if(matcher.test(name, null)){
+                result.add(name);
             }
         }
         return result;
     }
 
     @Override
-    public Configuration with(ConfigOperator operator) {
-        return null;
-    }
-
-    @Override
-    public <T> T query(ConfigQuery<T> query) {
-        return query.query(this);
-    }
-
-    @Override
-    public ConfigurationContext getContext() {
-        return baseConfiguration.getContext();
+    public Iterable<ConfigSource> getConfigSources() {
+        return this.baseConfiguration.getConfigSources();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java b/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java
index dd2547f..ec48b2f 100644
--- a/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java
+++ b/modules/functions/src/main/java/org/apache/tamaya/functions/MappedConfiguration.java
@@ -18,110 +18,66 @@
  */
 package org.apache.tamaya.functions;
 
-import org.apache.tamaya.ConfigOperator;
-import org.apache.tamaya.ConfigQuery;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.spi.ConfigurationContext;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import javax.config.Config;
+import javax.config.spi.ConfigSource;
+import java.util.*;
 import java.util.logging.Logger;
 
 
 /**
  * Configuration that filters part of the entries defined by a filter predicate.
  */
-class MappedConfiguration implements Configuration {
+class MappedConfiguration implements Config {
 
     private static final Logger LOG = Logger.getLogger(MappedConfiguration.class.getName());
-    private final Configuration baseConfiguration;
+    private final Config baseConfiguration;
     private final KeyMapper keyMapper;
     private final String mapType;
 
-    MappedConfiguration(Configuration baseConfiguration, KeyMapper keyMapper, String mapType) {
+    MappedConfiguration(Config baseConfiguration, KeyMapper keyMapper, String mapType) {
         this.baseConfiguration = Objects.requireNonNull(baseConfiguration);
         this.keyMapper = Objects.requireNonNull(keyMapper);
         this.mapType = mapType!=null?mapType:this.keyMapper.toString();
     }
 
     @Override
-    public String get(String key) {
-        return get(key, String.class);
-    }
-
-    @Override
-    public String getOrDefault(String key, String defaultValue) {
-        Objects.requireNonNull(key, "Key must be given");
-        Objects.requireNonNull(defaultValue, "DefaultValue must be given.");
-        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;
+    public <T> T getValue(String key, Class<T> type) {
+        String targetKey = keyMapper.mapKey(key);
+        if (targetKey != null) {
+            return baseConfiguration.getValue(targetKey, type);
         }
-        return val;
-    }
+        LOG.finest("Configuration property hidden by KeyMapper, key="+key+", mapper="+keyMapper+", config="+this);
+        return null;
 
-    @Override
-    public <T> T get(String key, Class<T> type) {
-        return (T)get(key, TypeLiteral.of(type));
     }
 
     @Override
-    public <T> T get(String key, TypeLiteral<T> type) {
+    public <T> Optional<T> getOptionalValue(String key, Class<T> type) {
         String targetKey = keyMapper.mapKey(key);
         if (targetKey != null) {
-            return baseConfiguration.get(targetKey, type);
+            return baseConfiguration.getOptionalValue(targetKey, type);
         }
         LOG.finest("Configuration property hidden by KeyMapper, key="+key+", mapper="+keyMapper+", config="+this);
-        return null;
+        return Optional.empty();
     }
 
-    @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 Map<String, String> getProperties() {
-        Map<String, String> baseProps = baseConfiguration.getProperties();
-        Map<String, String> props = new HashMap<>(baseProps.size());
-        for(Map.Entry<String,String> en:baseProps.entrySet()){
-            String targetKey = keyMapper.mapKey(en.getKey());
+    public Iterable<String> getPropertyNames() {
+        Iterable<String> propertyNames = baseConfiguration.getPropertyNames();
+        Set<String> result = new HashSet<>();
+        for(String key:propertyNames){
+            String targetKey = keyMapper.mapKey(key);
             if (targetKey != null) {
-                props.put(targetKey, en.getValue());
+                result.add(targetKey);
             }
         }
-        return props;
-    }
-
-    @Override
-    public Configuration with(ConfigOperator operator) {
-        return operator.operate(this);
-    }
-
-    @Override
-    public <T> T query(ConfigQuery<T> query) {
-        return query.query(this);
+        return result;
     }
 
     @Override
-    public ConfigurationContext getContext() {
-        return baseConfiguration.getContext();
+    public Iterable<ConfigSource> getConfigSources() {
+        return baseConfiguration.getConfigSources();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tamaya-extensions/blob/581c92e7/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java
----------------------------------------------------------------------
diff --git a/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java b/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java
index 16cabeb..bb27ccd 100644
--- a/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java
+++ b/modules/functions/src/test/java/org/apache/tamaya/functions/CombinedConfigurationTest.java
@@ -18,21 +18,15 @@
  */
 package org.apache.tamaya.functions;
 
-import org.apache.tamaya.ConfigOperator;
-import org.apache.tamaya.ConfigQuery;
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.TypeLiteral;
-import org.apache.tamaya.spi.ConfigurationContext;
+import org.apache.tamaya.base.DefaultConfigBuilder;
+import org.apache.tamaya.base.configsource.SimpleConfigSource;
 import org.apache.tamaya.spisupport.DefaultConfiguration;
-import org.apache.tamaya.core.internal.CoreConfigurationBuilder;
-import org.apache.tamaya.spisupport.propertysource.SimplePropertySource;
 import org.assertj.core.api.ThrowableAssert;
 import org.junit.Test;
 import org.mockito.Mockito;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
+import javax.config.Config;
+import java.util.*;
 
 import static java.util.Arrays.asList;
 import static java.util.Collections.singletonMap;
@@ -40,53 +34,43 @@ import static org.apache.tamaya.functions.MethodNotMockedAnswer.NOT_MOCKED_ANSWE
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.assertj.core.api.Assertions.within;
+import static org.junit.Assert.*;
 import static org.mockito.Mockito.*;
 
 
 public class CombinedConfigurationTest {
-    private Configuration configWithA1;
-    private Configuration configWithA2;
-    private Configuration configWithB;
-    private Configuration configWithC;
-    private Configuration configWithoutEntries;
+    private Config configWithA1;
+    private Config configWithA2;
+    private Config configWithB;
+    private Config configWithC;
+    private Config configWithoutEntries;
 
     {
-        SimplePropertySource sourceWithKeyA1 = new SimplePropertySource("A", singletonMap("a", "a1"));
-        SimplePropertySource sourceWithKeyA2 = new SimplePropertySource("A", singletonMap("a", "a2"));
-        SimplePropertySource sourceWithKeyB = new SimplePropertySource("B", singletonMap("b", "b"));
-        SimplePropertySource sourceWithKeyC = new SimplePropertySource("C", singletonMap("c", "c"));
-        SimplePropertySource sourceWithoutKeys = new SimplePropertySource("NONE", Collections.<String, String>emptyMap());
-
-        Configuration ccWithA1 = new CoreConfigurationBuilder().addPropertySources(sourceWithKeyA1)
-                                                                                .build();
-        Configuration ccWithA2 = new CoreConfigurationBuilder().addPropertySources(sourceWithKeyA2)
-                                                                                .build();
-        Configuration ccWithB = new CoreConfigurationBuilder().addPropertySources(sourceWithKeyB)
-                                                                               .build();
-        Configuration ccWithC = new CoreConfigurationBuilder().addPropertySources(sourceWithKeyC)
-                                                                               .build();
-        Configuration ccWithoutEntries = new CoreConfigurationBuilder().addPropertySources(sourceWithoutKeys)
-                                                                                        .build();
-
-        configWithA1 = new DefaultConfiguration(ccWithA1.getContext());
-        configWithA2 = new DefaultConfiguration(ccWithA2.getContext());
-        configWithB = new DefaultConfiguration(ccWithB.getContext());
-        configWithC = new DefaultConfiguration(ccWithC.getContext());
-        configWithoutEntries = new DefaultConfiguration(ccWithoutEntries.getContext());
+        SimpleConfigSource sourceWithKeyA1 = new SimpleConfigSource("A", singletonMap("a", "a1"));
+        SimpleConfigSource sourceWithKeyA2 = new SimpleConfigSource("A", singletonMap("a", "a2"));
+        SimpleConfigSource sourceWithKeyB = new SimpleConfigSource("B", singletonMap("b", "b"));
+        SimpleConfigSource sourceWithKeyC = new SimpleConfigSource("C", singletonMap("c", "c"));
+        SimpleConfigSource sourceWithoutKeys = new SimpleConfigSource("NONE", Collections.<String, String>emptyMap());
+
+        configWithA1 = new DefaultConfigBuilder().withSources(sourceWithKeyA1).build();
+        configWithA2 = new DefaultConfigBuilder().withSources(sourceWithKeyA2).build();
+        configWithB = new DefaultConfigBuilder().withSources(sourceWithKeyB).build();
+        configWithC = new DefaultConfigBuilder().withSources(sourceWithKeyC).build();
+        configWithoutEntries = new DefaultConfigBuilder().withSources(sourceWithoutKeys).build();
     }
 
     @Test
     public void createCombinedConfigurationWithNullAsSingleConfiguration() {
         CombinedConfiguration cc = new CombinedConfiguration("abc", null);
 
-        assertThat(cc.get("nil")).isNull();
+        assertThat(cc.getValue("nil", String.class)).isNull();
     }
 
     @Test
     public void createCombinedConfigurationWithNullNullAsSingleConfiguration() {
         CombinedConfiguration cc = new CombinedConfiguration("abc", null, null);
 
-        assertThat(cc.get("nil")).isNull();
+        assertThat(cc.getValue("nil", String.class)).isNull();
     }
 
     @Test
@@ -94,21 +78,21 @@ public class CombinedConfigurationTest {
 
         CombinedConfiguration cc = new CombinedConfiguration("abc", configWithA1, configWithB, configWithC);
 
-        assertThat(cc.get("key")).isNull();
+        assertThat(cc.getValue("key", String.class)).isNull();
     }
 
     @Test
     public void requestedEntryIsInTheFirstAndThridConfiguration() {
         CombinedConfiguration cc = new CombinedConfiguration("abc", configWithA1, configWithB, configWithA2);
 
-        assertThat(cc.get("a")).isEqualTo("a2");
+        assertThat(cc.getValue("a", String.class)).isEqualTo("a2");
     }
 
     @Test
     public void requestedEntryIsOnlyInOneConfiguration() {
         CombinedConfiguration cc = new CombinedConfiguration("abc", configWithA1, configWithB, configWithC);
 
-        assertThat(cc.get("b")).isEqualTo("b");
+        assertThat(cc.getValue("b", String.class)).isEqualTo("b");
     }
 
     /*
@@ -116,49 +100,25 @@ public class CombinedConfigurationTest {
      */
 
     @Test
-    public void getOrDefaultWithSignatureStringStringThrowsNPEIfKeyIsNull() {
+    public void getOptionalValueWithSignatureStringStringThrowsNPEIfKeyIsNull() {
         final CombinedConfiguration cc = mock(CombinedConfiguration.class, CALLS_REAL_METHODS);
 
         assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
             @Override
             public void call() throws Throwable {
-                cc.getOrDefault(null, "d");
+                cc.getOptionalValue(null, String.class).orElse("d");
             }
         }).isInstanceOf(NullPointerException.class)
           .hasMessage("Key must be given.");
     }
 
     @Test
-    public void getOrDefaultWithSignatureStringStringThrowsNPEIfValueIsNull() {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class, CALLS_REAL_METHODS);
-
-        assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
-            @Override
-            public void call() throws Throwable {
-                cc.getOrDefault("key", (String)null);
-            }
-        }).isInstanceOf(NullPointerException.class)
-          .hasMessage("Value must be given.");
-    }
-
-    @Test
-    public void getOrDefaultWithSignatureStringStringReturnsDefaultIfKeyIsUnknown() {
-        CombinedConfiguration cc = mock(CombinedConfiguration.class);
-        doReturn(null).when(cc).get("a");
-        doCallRealMethod().when(cc).getOrDefault(anyString(), anyString());
-
-        String result = cc.getOrDefault("a", "tzui");
+    public void getOptionalValueWithSignatureStringStringReturnsFoundValueIfKeyIsKnown() {
+        Config cfg = mock(Config.class);
+        doReturn(Optional.of("b")).when(cfg).getOptionalValue("a", String.class);
 
-        assertThat(result).isEqualTo("tzui");
-    }
-
-    @Test
-    public void getOrDefaultWithSignatureStringStringReturnsFoundValueIfKeyIsKnown() {
-        CombinedConfiguration cc = mock(CombinedConfiguration.class);
-        doReturn("b").when(cc).get(Mockito.eq("a"));
-        doCallRealMethod().when(cc).getOrDefault(anyString(), anyString());
-
-        String result = cc.getOrDefault("a", "z");
+        String result =  new CombinedConfiguration("test", cfg)
+                .getOptionalValue("a", String.class).get();
 
         assertThat(result).isEqualTo("b");
     }
@@ -168,15 +128,15 @@ public class CombinedConfigurationTest {
      */
 
     @Test
-    public void getOrDefaultStringTypeLiteralTThrowsNPEIfKeyIsNull() throws Exception {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class);
-        doCallRealMethod().when(cc).getOrDefault(anyString(), eq(TypeLiteral.of(Integer.class)),
-                                                 Mockito.any(Integer.class));
+    public void getOptionalValueStringTypeTThrowsNPEIfKeyIsNull() throws Exception {
+        final Config cfg = mock(Config.class);
+        doReturn(Optional.of(Integer.valueOf(67))).when(cfg).getOptionalValue("a", Integer.class);
 
         assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
             @Override
             public void call() throws Throwable {
-                cc.getOrDefault(null, TypeLiteral.of(Integer.class), 1);
+                new CombinedConfiguration("test", cfg)
+                        .getOptionalValue(null, Integer.class).orElse(1);
             }
         }).isInstanceOf(NullPointerException.class)
           .hasMessage("Key must be given.");
@@ -184,59 +144,40 @@ public class CombinedConfigurationTest {
     }
 
     @Test
-    public void getOrDefaultStringTypeLiteralTThrowsNPEIfTypeIsNull() throws Exception {
+    public void getOptionalValueStringTypeThrowsNPEIfTypeIsNull() throws Exception {
         final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-        doCallRealMethod().when(cc).getOrDefault(anyString(), eq((TypeLiteral<Integer>)null),
-                                                 Mockito.any(Integer.class));
+        doCallRealMethod().when(cc).getOptionalValue(eq("a"), any(Class.class));
 
         assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
             @Override
             public void call() throws Throwable {
-                cc.<Integer>getOrDefault("a", (TypeLiteral<Integer>)null, 1);
+                cc.<Integer>getOptionalValue("a", (Class)null);
             }
         }).isInstanceOf(NullPointerException.class)
           .hasMessage("Type must be given.");
     }
 
     @Test
-    public void getOrDefaultStringTypeLiteralTThrowsNPEIfDefaultValueIsNull() throws Exception {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-        doCallRealMethod().when(cc).getOrDefault(anyString(), eq(TypeLiteral.of(Integer.class)),
-                                                 Mockito.any(Integer.class));
-
-        assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
-            @Override
-            public void call() throws Throwable {
-                cc.getOrDefault("a", TypeLiteral.of(Integer.class), null);
-            }
-        }).isInstanceOf(NullPointerException.class)
-          .hasMessage("Default value must be given.");
-    }
-
-    @Test
-    public void getOrDefaultStringTypeLiteralTReturnsDefaultValueIfKeyIsUnknown() throws Exception {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-        doReturn(null).when(cc).get(eq("a"), eq(TypeLiteral.<Integer>of(Integer.class)));
-        doCallRealMethod().when(cc).getOrDefault(anyString(), eq(TypeLiteral.of(Integer.class)),
-                                                 Mockito.any(Integer.class));
-
-        TypeLiteral<Integer> typeLiteral = TypeLiteral.of(Integer.class);
-        Integer result = cc.<Integer>getOrDefault("a", typeLiteral, 789);
-
-        assertThat(result).isEqualTo(789);
+    public void getOptionalValueStringTypeTReturnsEmptyOptionalIfKeyIsUnknown() throws Exception {
+        final Config cfg = mock(Config.class);
+        doReturn(null).when(cfg).getOptionalValue(any(), any(Class.class));
+        Optional<Integer> val = new CombinedConfiguration("test", cfg)
+                .getOptionalValue("b", Integer.class);
+        assertNotNull(val);
+        assertFalse(val.isPresent());
     }
 
 
     @Test
-    public void getOrDefaultStringTypeLiteralTReturnsFoundValueIfKeyIsKnown() throws Exception {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-        doReturn(999).when(cc).get(eq("a"), eq(TypeLiteral.<Integer>of(Integer.class)));
-        doCallRealMethod().when(cc).getOrDefault(anyString(), eq(TypeLiteral.of(Integer.class)),
-                                                 Mockito.anyInt());
-
-        Integer result = cc.<Integer>getOrDefault("a", TypeLiteral.<Integer>of(Integer.class), 789);
-
-        assertThat(result).isEqualTo(999);
+    public void getOptionalValueStringTypeReturnsFoundValueIfKeyIsKnown() throws Exception {
+        final Config cfg = mock(Config.class);
+        doReturn(Optional.of(Integer.valueOf(768))).when(cfg).getOptionalValue("a", Integer.class);
+
+        Optional<Integer> val = new CombinedConfiguration("test", cfg)
+                .getOptionalValue("a", Integer.class);
+        assertNotNull(val);
+        assertTrue(val.isPresent());
+        assertEquals(Integer.valueOf(768), val.get());
     }
 
     /*
@@ -244,72 +185,38 @@ public class CombinedConfigurationTest {
      */
 
     @Test
-    public void getOrDefaultStringClassTThrowsNPEIfKeyIsNull() throws Exception {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class);
-        doCallRealMethod().when(cc).getOrDefault(anyString(), Mockito.any(Class.class),
-                                                 Mockito.any(Integer.class));
-
+    public void getOptionalValueStringClassTThrowsNPEIfKeyIsNull() throws Exception {
+        final Config cfg = mock(Config.class,NOT_MOCKED_ANSWER);
         assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
             @Override
             public void call() throws Throwable {
-                cc.getOrDefault(null, Integer.class, 1);
+                new CombinedConfiguration("test", cfg).getOptionalValue(null, Integer.class);
             }
         }).isInstanceOf(NullPointerException.class)
           .hasMessage("Key must be given.");
     }
 
     @Test
-    public void getOrDefaultStringClassTThrowsNPEIfTypeIsNull() throws Exception {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class);
-        doCallRealMethod().when(cc).getOrDefault(anyString(), Mockito.any(Class.class), Mockito.anyInt());
+    public void getOptionalValueStringClassTThrowsNPEIfTypeIsNull() throws Exception {
+        final Config cfg = mock(Config.class,NOT_MOCKED_ANSWER);
 
         assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
             @Override
             public void call() throws Throwable {
-                cc.getOrDefault("a", (Class<Integer>) null, 1);
+                new CombinedConfiguration("test", cfg)
+                        .getOptionalValue("a", (Class<Integer>) null);
             }
         }).isInstanceOf(NullPointerException.class)
           .hasMessage("Type must be given.");
     }
 
     @Test
-    public void getOrDefaultStringClassTThrowsNPEIfDefaultValueIsNull() throws Exception {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-        doCallRealMethod().when(cc).getOrDefault(anyString(), any(Class.class),
-                                                 Mockito.any(Integer.class));
-
-        assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
-            @Override
-            public void call() throws Throwable {
-                cc.getOrDefault("a", Integer.class, null);
-            }
-        }).isInstanceOf(NullPointerException.class)
-          .hasMessage("Default value must be given.");
-    }
-
-    @Test
-    public void getOrDefaultStringClassTReturnsDefaultValueIfKeyIsUnknown() throws Exception {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-        doReturn(null).when(cc).get(eq("a"), any(Class.class));
-        doCallRealMethod().when(cc).getOrDefault(anyString(), any(Class.class),
-                                                 Mockito.any(Integer.class));
-
-        TypeLiteral<Integer> typeLiteral = TypeLiteral.of(Integer.class);
-        Integer result = cc.<Integer>getOrDefault("a", Integer.class, 789);
-
-        assertThat(result).isEqualTo(789);
-    }
-
-
-    @Test
-    public void getOrDefaultStringClassTReturnsFoundValueIfKeyIsKnown() throws Exception {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-        doReturn(999).when(cc).get(eq("a"), any(Class.class));
-        doCallRealMethod().when(cc).getOrDefault(anyString(), any(Class.class),
-                                                 Mockito.anyInt());
-
-        Integer result = cc.<Integer>getOrDefault("a", Integer.class, 789);
-
+    public void getOptionalValueStringClassTReturnsFoundValueIfKeyIsKnown() throws Exception {
+        final Config cfg = mock(Config.class);
+        doReturn(Optional.of(Integer.valueOf(999))).when(cfg).getOptionalValue(eq("a"), any(Class.class));
+        doReturn(Optional.of(Integer.valueOf(999))).when(cfg).getOptionalValue(eq("a"), any(Class.class));
+        Integer result = new CombinedConfiguration("test", cfg)
+                .getOptionalValue("a", Integer.class).orElse(789);
         assertThat(result).isEqualTo(999);
     }
 
@@ -319,152 +226,79 @@ public class CombinedConfigurationTest {
 
     @Test
     public void getPropertiesReturnsEmptyMapIfAllConfigurationsAreEmpty() throws Exception {
-        Map<String, String> propsOfA = new HashMap<>();
-        Map<String, String> propsOfB = new HashMap<>();
-        Map<String, String> propsOfC = new HashMap<>();
-
-        Configuration configA = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER);
-        Configuration configB = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER);
-        Configuration configC = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER);
+        Iterable<String> namesOfA = new HashSet<>();
+        Iterable<String> namesOfB = new HashSet<>();
+        Iterable<String> namesOfC = new HashSet<>();
 
-        doReturn(propsOfA).when(configA).getProperties();
-        doReturn(propsOfB).when(configB).getProperties();
-        doReturn(propsOfC).when(configC).getProperties();
+        Config configA = Mockito.mock(Config.class, NOT_MOCKED_ANSWER);
+        Config configB = Mockito.mock(Config.class, NOT_MOCKED_ANSWER);
+        Config configC = Mockito.mock(Config.class, NOT_MOCKED_ANSWER);
 
-        CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-
-        doReturn(asList(configA, configB, configC)).when(cc).getConfigurations();
-        doCallRealMethod().when(cc).getProperties();
-
-        Map<String, String> result = cc.getProperties();
+        doReturn(namesOfA).when(configA).getPropertyNames();
+        doReturn(namesOfB).when(configB).getPropertyNames();
+        doReturn(namesOfC).when(configC).getPropertyNames();
 
+        CombinedConfiguration cc = new CombinedConfiguration("test", configA, configB, configC);
+        Iterable<String> result = cc.getPropertyNames();
         assertThat(result).isEmpty();
     }
 
     @Test
-    public void getPropertiesReturnsLastValueOfManyForAGivenKey() throws Exception {
-        Map<String, String> propsOfA = new HashMap<String, String>() {{ put("a", "A"); }};
-        Map<String, String> propsOfB = new HashMap<String, String>() {{ put("b", "B"); }};
-        Map<String, String> propsOfC = new HashMap<String, String>() {{ put("a", "Z"); }};
-
-        Configuration configA = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER);
-        Configuration configB = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER);
-        Configuration configC = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER);
-
-        doReturn(propsOfA).when(configA).getProperties();
-        doReturn(propsOfB).when(configB).getProperties();
-        doReturn(propsOfC).when(configC).getProperties();
-
-        CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-
-        doReturn(asList(configA, configB, configC)).when(cc).getConfigurations();
-        doCallRealMethod().when(cc).getProperties();
-
-        Map<String, String> result = cc.getProperties();
-
-        assertThat(result).containsEntry("a", "Z")
-                          .doesNotContainEntry("a", "A");
+    public void getPropertyValueReturnsLastValueOfManyForAGivenKey() throws Exception {
+        Set<String> propsOfA = new HashSet<String>() {{ add("a"); }};
+        Set<String> propsOfB = new HashSet<String>() {{ add("a"); }};
+        Set<String> propsOfC = new HashSet<String>() {{ add("a"); }};
+
+        Config configA = Mockito.mock(Config.class, NOT_MOCKED_ANSWER);
+        Config configB = Mockito.mock(Config.class, NOT_MOCKED_ANSWER);
+        Config configC = Mockito.mock(Config.class, NOT_MOCKED_ANSWER);
+
+        doReturn(Optional.of("A")).when(configA).getOptionalValue(eq("a"), any());
+        doReturn(Optional.of("B")).when(configB).getOptionalValue(eq("a"), any());
+        doReturn(Optional.of("C")).when(configC).getOptionalValue(eq("a"), any());
+        doReturn(Optional.empty()).when(configA).getOptionalValue(eq("foo"), any());
+        doReturn(Optional.empty()).when(configB).getOptionalValue(eq("foo"), any());
+        doReturn(Optional.empty()).when(configC).getOptionalValue(eq("foo"), any());
+        doReturn(propsOfA).when(configA).getPropertyNames();
+        doReturn(propsOfB).when(configB).getPropertyNames();
+        doReturn(propsOfC).when(configC).getPropertyNames();
+
+        CombinedConfiguration cc = new CombinedConfiguration("test", configA, configB, configC);
+        Iterable<String> result = cc.getPropertyNames();
+
+        assertThat(result).hasSize(1)
+                .contains("a");
+        assertThat(cc.getValue("a", String.class))
+                .isEqualTo("C");
+        assertThat(cc.getValue("foo", String.class))
+                .isNull();
     }
 
     @Test
-    public void getPropertiesReturnsAllProperties() throws Exception {
-        Map<String, String> propsOfA = new HashMap<String, String>() {{ put("a", "A"); }};
-        Map<String, String> propsOfB = new HashMap<String, String>() {{ put("b", "B"); }};
-        Map<String, String> propsOfC = new HashMap<String, String>() {{ put("c", "C"); }};
-
-        Configuration configA = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER);
-        Configuration configB = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER);
-        Configuration configC = Mockito.mock(Configuration.class, NOT_MOCKED_ANSWER);
+    public void getPropertyNamesReturnsAllProperties() throws Exception {
+        Set<String> propsOfA = new HashSet<String>() {{ add("a"); }};
+        Set<String> propsOfB = new HashSet<String>() {{ add("b"); }};
+        Set<String> propsOfC = new HashSet<String>() {{ add("c"); }};
 
-        doReturn(propsOfA).when(configA).getProperties();
-        doReturn(propsOfB).when(configB).getProperties();
-        doReturn(propsOfC).when(configC).getProperties();
+        Config configA = Mockito.mock(Config.class, NOT_MOCKED_ANSWER);
+        Config configB = Mockito.mock(Config.class, NOT_MOCKED_ANSWER);
+        Config configC = Mockito.mock(Config.class, NOT_MOCKED_ANSWER);
 
-        CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
+        doReturn("A").when(configA).getValue("a", String.class);
+        doReturn("B").when(configB).getValue("b", String.class);
+        doReturn("C").when(configC).getValue("c", String.class);
+        doReturn(propsOfA).when(configA).getPropertyNames();
+        doReturn(propsOfB).when(configB).getPropertyNames();
+        doReturn(propsOfC).when(configC).getPropertyNames();
 
-        doReturn(asList(configA, configB, configC)).when(cc).getConfigurations();
-        doCallRealMethod().when(cc).getProperties();
-
-        Map<String, String> result = cc.getProperties();
+        CombinedConfiguration cc = new CombinedConfiguration("test", configA, configB, configC);
+        Iterable<String> result = cc.getPropertyNames();
 
         assertThat(result).hasSize(3)
-                          .containsEntry("a", "A")
-                          .containsEntry("b", "B")
-                          .containsEntry("c", "C");
-    }
-
-    /*
-     * Tests for with(ConfigOperator)
-     */
-
-    @Test
-    public void withWithIndentityOperatorReturnsEqualConfiguration() throws Exception {
-        class IdentityOpr implements ConfigOperator {
-            @Override
-            public Configuration operate(Configuration config) {
-                return config;
-            }
-        }
-
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-        doCallRealMethod().when(cc).with(Mockito.any(ConfigOperator.class));
-
-        Configuration result = cc.with(new IdentityOpr());
-
-        assertThat(result).isNotNull()
-                          .isEqualTo(result);
-    }
-
-    @Test
-    public void withWithNullAsOperatorParmeterThrowsNPE() throws Exception {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-        doCallRealMethod().when(cc).with(Mockito.any(ConfigOperator.class));
-
-        assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
-            @Override
-            public void call() throws Throwable {
-                cc.with(null);
-            }
-        }).isInstanceOf(NullPointerException.class)
-          .hasMessage("Operator must be given.");
-    }
-
-    /*
-     * Tests for query(ConfigQuery)
-     */
-
-    @Test
-    public void queryWithNullAsQueryParameterThrowsNPE() throws Exception {
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-        doCallRealMethod().when(cc).query(Mockito.any(ConfigQuery.class));
-
-        assertThatThrownBy(new ThrowableAssert.ThrowingCallable() {
-            @Override
-            public void call() throws Throwable {
-                cc.query(null);
-            }
-        }).isInstanceOf(NullPointerException.class)
-          .hasMessage("Query must be given.");
-    }
-
-    @Test
-    public void queryWithRealQueryReturnsCorrectResult() throws Exception {
-        class GetZahl implements ConfigQuery<Integer> {
-            @Override
-            public Integer query(Configuration config) {
-                return config.get("zahl", Integer.class);
-            }
-        }
-
-        final CombinedConfiguration cc = mock(CombinedConfiguration.class, NOT_MOCKED_ANSWER);
-        doCallRealMethod().when(cc).query(Mockito.any(ConfigQuery.class));
-        doReturn(1).when(cc).<Integer>get(eq("zahl"), eq(Integer.class));
-
-        Integer result = cc.query(new GetZahl());
-
-        assertThat(result).isEqualTo(1);
+                          .contains("a")
+                          .contains("b")
+                          .contains("c");
     }
 
-    // ConfigurationContext getContext();  none one three
 
 }
\ No newline at end of file