Added a programmatic callback for changesets.
diff --git a/core/src/main/java/org/apache/tamaya/core/config/ConfigChangeSet.java b/api/src/main/java/org/apache/tamaya/ConfigChangeSet.java
similarity index 98%
rename from core/src/main/java/org/apache/tamaya/core/config/ConfigChangeSet.java
rename to api/src/main/java/org/apache/tamaya/ConfigChangeSet.java
index 7ef3477..dda7701 100644
--- a/core/src/main/java/org/apache/tamaya/core/config/ConfigChangeSet.java
+++ b/api/src/main/java/org/apache/tamaya/ConfigChangeSet.java
@@ -16,9 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.core.config;
-
-import org.apache.tamaya.PropertySource;
+package org.apache.tamaya;
 
 import java.beans.PropertyChangeEvent;
 import java.io.Serializable;
diff --git a/core/src/main/java/org/apache/tamaya/core/config/ConfigChangeSetBuilder.java b/api/src/main/java/org/apache/tamaya/ConfigChangeSetBuilder.java
similarity index 98%
rename from core/src/main/java/org/apache/tamaya/core/config/ConfigChangeSetBuilder.java
rename to api/src/main/java/org/apache/tamaya/ConfigChangeSetBuilder.java
index 0b536e0..a5ef042 100644
--- a/core/src/main/java/org/apache/tamaya/core/config/ConfigChangeSetBuilder.java
+++ b/api/src/main/java/org/apache/tamaya/ConfigChangeSetBuilder.java
@@ -16,10 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.tamaya.core.config;
-
-import org.apache.tamaya.Configuration;
-import org.apache.tamaya.PropertySource;
+package org.apache.tamaya;
 
 import java.beans.PropertyChangeEvent;
 import java.util.*;
diff --git a/api/src/main/java/org/apache/tamaya/Configuration.java b/api/src/main/java/org/apache/tamaya/Configuration.java
index 73eb41a..0999b1f 100644
--- a/api/src/main/java/org/apache/tamaya/Configuration.java
+++ b/api/src/main/java/org/apache/tamaya/Configuration.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tamaya;
 
+import org.apache.tamaya.spi.ConfigChangeSetCallback;
 import org.apache.tamaya.spi.ConfigurationFactorySpi;
 import org.apache.tamaya.spi.ConfigurationSpi;
 import org.apache.tamaya.spi.ServiceContext;
@@ -61,13 +62,28 @@
         }
 
         @Override
+        public void update(ConfigChangeSet changeSet) {
+
+        }
+
+        @Override
+        public void registerForUpdate(ConfigChangeSetCallback callback) {
+
+        }
+
+        @Override
+        public void removeForUpdate(ConfigChangeSetCallback callback) {
+
+        }
+
+        @Override
         public Map<String, String> getProperties() {
             return Collections.emptyMap();
         }
 
         @Override
         public String toString(){
-            return "PropertySource [name=<empty>]";
+            return "Configuration [name=<empty>]";
         }
     };
 
diff --git a/api/src/main/java/org/apache/tamaya/PropertySource.java b/api/src/main/java/org/apache/tamaya/PropertySource.java
index f4b01ae..152411a 100644
--- a/api/src/main/java/org/apache/tamaya/PropertySource.java
+++ b/api/src/main/java/org/apache/tamaya/PropertySource.java
@@ -18,7 +18,10 @@
 */
 package org.apache.tamaya;
 
+import org.apache.tamaya.spi.ConfigChangeSetCallback;
+
 import java.util.*;
+import java.util.concurrent.Callable;
 import java.util.function.Function;
 import java.util.function.UnaryOperator;
 
@@ -58,6 +61,21 @@
         }
 
         @Override
+        public void update(ConfigChangeSet changeSet) {
+
+        }
+
+        @Override
+        public void registerForUpdate(ConfigChangeSetCallback callback) {
+
+        }
+
+        @Override
+        public void removeForUpdate(ConfigChangeSetCallback callback) {
+
+        }
+
+        @Override
         public Map<String, String> getProperties() {
             return Collections.emptyMap();
         }
@@ -125,5 +143,25 @@
         return query.apply(this);
     }
 
+    /**
+     * Upon receiving a ConfigChangeSet, the PropertySource will be updated to include
+     * any of the listed changes within
+     *
+     * @param changeSet the changes to be invoked
+     */
+    void update(ConfigChangeSet changeSet);
+
+    /**
+     * Whenever this PropertySource is updated, any registered callables will be invoked
+     * @param callback
+     */
+    void registerForUpdate(ConfigChangeSetCallback callback);
+
+    /**
+     * Removes a callback to be invoked.
+     * @param callback
+     */
+    void removeForUpdate(ConfigChangeSetCallback callback);
+
 
 }
diff --git a/api/src/main/java/org/apache/tamaya/spi/ConfigChangeSetCallback.java b/api/src/main/java/org/apache/tamaya/spi/ConfigChangeSetCallback.java
new file mode 100644
index 0000000..889b8c4
--- /dev/null
+++ b/api/src/main/java/org/apache/tamaya/spi/ConfigChangeSetCallback.java
@@ -0,0 +1,33 @@
+/*
+ * 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.spi;
+
+import org.apache.tamaya.ConfigChangeSet;
+
+/**
+ * A callback to be notified whenever a change comes in
+ */
+@FunctionalInterface
+public interface ConfigChangeSetCallback {
+    /**
+     * Method to be invoked on change.  Includes the ConfigChangeSet.
+     * @param changeSet
+     */
+    public void onChange(ConfigChangeSet changeSet);
+}
diff --git a/api/src/main/java/org/apache/tamaya/spi/ConfigurationFactorySpi.java b/api/src/main/java/org/apache/tamaya/spi/ConfigurationFactorySpi.java
index 3b167cc..a0a91d3 100644
--- a/api/src/main/java/org/apache/tamaya/spi/ConfigurationFactorySpi.java
+++ b/api/src/main/java/org/apache/tamaya/spi/ConfigurationFactorySpi.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tamaya.spi;
 
+import org.apache.tamaya.ConfigChangeSet;
 import org.apache.tamaya.Configuration;
 import org.apache.tamaya.PropertySource;
 
@@ -47,6 +48,21 @@
             }
 
             @Override
+            public void update(ConfigChangeSet changeSet) {
+                propertySource.update(changeSet);
+            }
+
+            @Override
+            public void registerForUpdate(ConfigChangeSetCallback callback) {
+                propertySource.registerForUpdate(callback);
+            }
+
+            @Override
+            public void removeForUpdate(ConfigChangeSetCallback callback) {
+                propertySource.removeForUpdate(callback);
+            }
+
+            @Override
             public Map<String, String> getProperties() {
                 return propertySource.getProperties();
             }
diff --git a/core/src/main/java/org/apache/tamaya/core/properties/AbstractPropertySource.java b/core/src/main/java/org/apache/tamaya/core/properties/AbstractPropertySource.java
index fbfd6df..6564e5b 100644
--- a/core/src/main/java/org/apache/tamaya/core/properties/AbstractPropertySource.java
+++ b/core/src/main/java/org/apache/tamaya/core/properties/AbstractPropertySource.java
@@ -21,7 +21,9 @@
 import java.io.Serializable;
 import java.util.*;
 
+import org.apache.tamaya.ConfigChangeSet;
 import org.apache.tamaya.PropertySource;
+import org.apache.tamaya.spi.ConfigChangeSetCallback;
 
 /**
  * Abstract base class for implementing a {@link org.apache.tamaya.PropertySource}.
@@ -39,6 +41,8 @@
      */
     private volatile Set<String> sources = new HashSet<>();
 
+    private volatile Set<ConfigChangeSetCallback> callbacks = new LinkedHashSet<>();
+
     /**
      * Constructor.
      */
@@ -82,6 +86,22 @@
         return b.append('}').toString();
     }
 
+    @Override
+    public void update(ConfigChangeSet changeSet) {
+        //TODO how do we want to update this guy?
+        this.callbacks.parallelStream().forEach((c) -> c.onChange(changeSet));
+    }
+
+    @Override
+    public void registerForUpdate(ConfigChangeSetCallback callback) {
+        this.callbacks.add(callback);
+    }
+
+    @Override
+    public void removeForUpdate(ConfigChangeSetCallback callback) {
+        this.callbacks.remove(callback);
+    }
+
     protected String printContents(StringBuilder b){
         Map<String,String> sortMap = getProperties();
         if(!(sortMap instanceof SortedMap)){