diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConfiguration.java b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConfiguration.java
index 1b81fd3..fa94278 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConfiguration.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConfiguration.java
@@ -44,73 +44,75 @@
 import org.osgi.framework.Version;
 
 class RegionConfiguration {
-    public static final String GLOBAL_REGION = "global";
 
-    static final String CLASSLOADER_PSEUDO_PROTOCOL = "classloader://";
-    static final String APIREGIONS_JOINGLOBAL = "sling.feature.apiregions.joinglobal";
-    static final String DEFAULT_REGIONS = "sling.feature.apiregions.default";
-    static final String PROPERTIES_RESOURCE_PREFIX = "sling.feature.apiregions.resource.";
-    static final String PROPERTIES_FILE_LOCATION = "sling.feature.apiregions.location";
-
-    static final String IDBSNVER_FILENAME = "idbsnver.properties";
-    static final String BUNDLE_FEATURE_FILENAME = "bundles.properties";
-    static final String FEATURE_REGION_FILENAME = "features.properties";
-    static final String REGION_PACKAGE_FILENAME = "regions.properties";
-
-    private static final String PROP_idbsnver = "mapping.bundleid.bsnver";
-    private static final String PROP_bundleFeatures = "mapping.bundleid.features";
-    private static final String PROP_featureRegions = "mapping.featureid.regions";
-    private static final String PROP_regionPackage = "mapping.region.packages";
 
     volatile Map<Map.Entry<String, Version>, List<String>> bsnVerMap;
     volatile Map<String, Set<String>> bundleFeatureMap;
     volatile Map<String, Set<String>> featureRegionMap;
     volatile Map<String, Set<String>> regionPackageMap;
+
     final Set<String> defaultRegions;
 
     private final Dictionary<String, Object> regProps = new Hashtable<>();
 
     private final Map<String, Dictionary<String, Object>> factoryConfigs = new ConcurrentHashMap<>();
 
+    private final Map<Map.Entry<String, Version>, List<String>> baseBsnVerMap;
+    private final Map<String, Set<String>> baseBundleFeatureMap;
+    private final Map<String, Set<String>> baseFeatureRegionMap;
+    private final Map<String, Set<String>> baseRegionPackageMap;
+
+    private final String toGlobalConfig;
+
     RegionConfiguration(Map<Entry<String, Version>, List<String>> bsnVerMap, Map<String, Set<String>> bundleFeatureMap,
                         Map<String, Set<String>> featureRegionMap, Map<String, Set<String>> regionPackageMap, Set<String> defaultRegions) {
-        this.bsnVerMap = bsnVerMap;
-        this.bundleFeatureMap = bundleFeatureMap;
-        this.featureRegionMap = featureRegionMap;
-        this.regionPackageMap = regionPackageMap;
         this.defaultRegions = defaultRegions;
+
+        this.baseBsnVerMap = new HashMap<>(bsnVerMap);
+        this.baseBundleFeatureMap = new HashMap<>(bundleFeatureMap);
+        this.baseFeatureRegionMap = new HashMap<>(featureRegionMap);
+        this.baseRegionPackageMap = new HashMap<>(regionPackageMap);
+
+        this.toGlobalConfig = null;
+
+        updateConfiguration();
     }
 
     RegionConfiguration(final BundleContext context)
             throws IOException, URISyntaxException {
 
-        URI idbsnverFile = getDataFileURI(context, IDBSNVER_FILENAME);
+        URI idbsnverFile = getDataFileURI(context, RegionConstants.IDBSNVER_FILENAME);
         // Register the location as a service property for diagnostic purposes
-        regProps.put(IDBSNVER_FILENAME, idbsnverFile.toString());
+        regProps.put(RegionConstants.IDBSNVER_FILENAME, idbsnverFile.toString());
         Map<Entry<String, Version>, List<String>> bvm = populateBSNVerMap(idbsnverFile);
 
-        URI bundlesFile = getDataFileURI(context, BUNDLE_FEATURE_FILENAME);
+        URI bundlesFile = getDataFileURI(context, RegionConstants.BUNDLE_FEATURE_FILENAME);
         // Register the location as a service property for diagnostic purposes
-        regProps.put(BUNDLE_FEATURE_FILENAME, bundlesFile.toString());
+        regProps.put(RegionConstants.BUNDLE_FEATURE_FILENAME, bundlesFile.toString());
         Map<String, Set<String>> bfm = populateBundleFeatureMap(bundlesFile);
 
-        URI featuresFile = getDataFileURI(context, FEATURE_REGION_FILENAME);
+        URI featuresFile = getDataFileURI(context, RegionConstants.FEATURE_REGION_FILENAME);
         // Register the location as a service property for diagnostic purposes
-        regProps.put(FEATURE_REGION_FILENAME, featuresFile.toString());
+        regProps.put(RegionConstants.FEATURE_REGION_FILENAME, featuresFile.toString());
         Map<String, Set<String>> frm = populateFeatureRegionMap(featuresFile);
 
-        URI regionsFile = getDataFileURI(context, REGION_PACKAGE_FILENAME);
+        URI regionsFile = getDataFileURI(context, RegionConstants.REGION_PACKAGE_FILENAME);
         // Register the location as a service property for diagnostic purposes
-        regProps.put(REGION_PACKAGE_FILENAME, regionsFile.toString());
+        regProps.put(RegionConstants.REGION_PACKAGE_FILENAME, regionsFile.toString());
         Map<String, Set<String>> rpm = populateRegionPackageMap(regionsFile);
 
-        String toglobal = context.getProperty(APIREGIONS_JOINGLOBAL);
-        if (toglobal != null) {
-            joinRegionsWithGlobal(toglobal, rpm);
-            regProps.put(APIREGIONS_JOINGLOBAL, toglobal);
+        // store base configuration
+        this.baseBsnVerMap = bvm;
+        this.baseBundleFeatureMap = bfm;
+        this.baseFeatureRegionMap = frm;
+        this.baseRegionPackageMap = rpm;
+
+        this.toGlobalConfig = context.getProperty(RegionConstants.APIREGIONS_JOINGLOBAL);
+        if ( this.toGlobalConfig != null ) {
+            regProps.put(RegionConstants.APIREGIONS_JOINGLOBAL, this.toGlobalConfig);
         }
 
-        String defRegProp = context.getProperty(DEFAULT_REGIONS);
+        String defRegProp = context.getProperty(RegionConstants.DEFAULT_REGIONS);
         if (defRegProp != null) {
             Set<String> defRegs = new HashSet<>();
             for (String region : Arrays.asList(defRegProp.split(","))) {
@@ -120,17 +122,80 @@
             }
             defaultRegions = Collections.unmodifiableSet(defRegs);
             if (defaultRegions.size() > 0) {
-                regProps.put(DEFAULT_REGIONS, defaultRegions.toString());
+                regProps.put(RegionConstants.DEFAULT_REGIONS, defaultRegions.toString());
             }
         } else {
             defaultRegions = Collections.emptySet();
         }
 
+        updateConfiguration();
+    }
+
+    private void updateConfiguration() {
+        final Map<Entry<String, Version>, List<String>> bvm = new HashMap<>(this.baseBsnVerMap);
+        final Map<String, Set<String>> bfm = new HashMap<>(this.baseBundleFeatureMap);
+        final Map<String, Set<String>> frm = new HashMap<>(this.baseFeatureRegionMap);
+        final Map<String, Set<String>> rpm = new HashMap<>(this.baseRegionPackageMap);
+
+        // apply configurations
+        for(final Dictionary<String, Object> props : this.factoryConfigs.values()) {
+            // bundle id to bsnver
+            Object valObj = props.get(RegionConstants.PROP_idbsnver);
+            if ( valObj != null ) {
+                for(final String val : convert(valObj)) {
+                    final String[] parts = val.split("=");
+                    final String n = parts[0];
+                    final String[] bsnver = parts[1].split("~");
+                    addBsnVerArtifact(bvm, bsnver[0], bsnver[1], n);
+                }
+            }
+
+            // bundle id to features
+            valObj = props.get(RegionConstants.PROP_bundleFeatures);
+            if ( valObj != null ) {
+                for(final String val : convert(valObj)) {
+                    final String[] parts = val.split("=");
+                    final String n = parts[0];
+                    final String[] features = parts[1].split(",");
+                    addValuesToMap(bfm, n, Arrays.asList(features));
+                }
+            }
+
+            // feature id to regions
+            valObj = props.get(RegionConstants.PROP_featureRegions);
+            if ( valObj != null ) {
+                for(final String val : convert(valObj)) {
+                    final String[] parts = val.split("=");
+                    final String n = parts[0];
+                    final String[] regions = parts[1].split(",");
+                    addValuesToMap(frm, n, Arrays.asList(regions));
+                }
+            }
+
+            // region to packages
+            valObj = props.get(RegionConstants.PROP_regionPackage);
+            if ( valObj != null ) {
+                for(final String val : convert(valObj)) {
+                    final String[] parts = val.split("=");
+                    final String n = parts[0];
+                    final String[] packages = parts[1].split(",");
+                    addValuesToMap(rpm, n, Arrays.asList(packages));
+                }
+            }
+
+        }
+
+        // join regions
+        if (this.toGlobalConfig != null) {
+            joinRegionsWithGlobal(this.toGlobalConfig, rpm);
+        }
+
         // Make all maps and their contents unmodifiable
         bsnVerMap = unmodifiableMapToList(bvm);
         bundleFeatureMap = unmodifiableMapToSet(bfm);
         featureRegionMap = unmodifiableMapToSet(frm);
         regionPackageMap = unmodifiableMapToSet(rpm);
+
     }
 
     private static <K,V> Map<K, List<V>> unmodifiableMapToList(Map<K, List<V>> m) {
@@ -153,7 +218,7 @@
             if (packages == null)
                 continue;
 
-            addValuesToMap(rpm, GLOBAL_REGION, packages);
+            addValuesToMap(rpm, RegionConstants.GLOBAL_REGION, packages);
             rpm.remove(region);
         }
     }
@@ -183,31 +248,11 @@
         List<String> l = bsnVerMap.get(bsnVer);
         if (l == null) {
             l = new ArrayList<>();
-        } else {
-            l = new ArrayList<>(l);
+            bsnVerMap.put(bsnVer, l);
         }
-        bsnVerMap.put(bsnVer, l);
         l.add(artifactId);
     }
 
-    private static void removeBsnVerArtifact(
-            Map<Map.Entry<String, Version>, List<String>> bsnVerMap,
-            String bundleSymbolicName, String bundleVersion,
-            String artifactId) {
-        Version version = Version.valueOf(bundleVersion);
-        Map.Entry<String, Version> bsnVer = new AbstractMap.SimpleEntry<>(bundleSymbolicName, version);
-        List<String> l = bsnVerMap.get(bsnVer);
-        if (l != null) {
-            l = new ArrayList<>(l);
-            l.remove(artifactId);
-            if ( l.isEmpty() ) {
-                bsnVerMap.remove(bsnVer);
-            } else {
-                bsnVerMap.put(bsnVer, l);
-            }
-        }
-    }
-
     private static Map<String, Set<String>> populateBundleFeatureMap(URI bundlesFile) throws IOException {
         return loadMap(bundlesFile);
     }
@@ -240,30 +285,15 @@
         Set<String> bf = map.get(key);
         if (bf == null) {
             bf = new LinkedHashSet<>(); // It's important that the insertion order is maintained.
-        } else {
-            bf = new LinkedHashSet<>(bf);
+            map.put(key, bf);
         }
-        map.put(key, bf);
         bf.addAll(values);
     }
 
-    private static void removeValuesFromMap(Map<String, Set<String>> map, String key, Collection<String> values) {
-        Set<String> bf = map.get(key);
-        if (bf != null) {
-            bf = new LinkedHashSet<>(bf); // It's important that the insertion order is maintained.
-            bf.removeAll(values);
-            if ( bf.isEmpty() ) {
-                map.remove(key);
-            } else {
-                map.put(key, bf);
-            }
-        }
-    }
-
     private URI getDataFileURI(BundleContext ctx, String name) throws IOException, URISyntaxException {
-        String fn = ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + name);
+        String fn = ctx.getProperty(RegionConstants.PROPERTIES_RESOURCE_PREFIX + name);
         if (fn == null) {
-            String loc = ctx.getProperty(PROPERTIES_FILE_LOCATION);
+            String loc = ctx.getProperty(RegionConstants.PROPERTIES_FILE_LOCATION);
             if (loc != null) {
                 fn = loc + "/" + name;
             }
@@ -274,9 +304,9 @@
                     + "region definition resource: " + name);
 
         if (fn.contains(":")) {
-            if (fn.startsWith(CLASSLOADER_PSEUDO_PROTOCOL)) {
+            if (fn.startsWith(RegionConstants.CLASSLOADER_PSEUDO_PROTOCOL)) {
                 // It's using the 'classloader:' protocol looks up the location from the classloader
-                String loc = fn.substring(CLASSLOADER_PSEUDO_PROTOCOL.length());
+                String loc = fn.substring(RegionConstants.CLASSLOADER_PSEUDO_PROTOCOL.length());
                 if (!loc.startsWith("/"))
                     loc = "/" + loc;
                 fn = getClass().getResource(loc).toString();
@@ -326,59 +356,8 @@
      * @param props The properties
      */
     public void setConfig(final String pid, final Dictionary<String, Object> props) {
-        this.removeConfig(pid);
         this.factoryConfigs.put(pid, props);
-        // bundle id to bsnver
-        Object valObj = props.get(PROP_idbsnver);
-        if ( valObj != null ) {
-            final Map<Map.Entry<String, Version>, List<String>> newMap = new HashMap<>(this.bsnVerMap);
-            for(final String val : convert(valObj)) {
-                final String[] parts = val.split("=");
-                final String n = parts[0];
-                final String[] bsnver = parts[1].split("~");
-                addBsnVerArtifact(newMap, bsnver[0], bsnver[1], n);
-            }
-            this.bsnVerMap = newMap;
-        }
-
-        // bundle id to features
-        valObj = props.get(PROP_bundleFeatures);
-        if ( valObj != null ) {
-            final Map<String, Set<String>> newMap = new HashMap<>(this.bundleFeatureMap);
-            for(final String val : convert(valObj)) {
-                final String[] parts = val.split("=");
-                final String n = parts[0];
-                final String[] features = parts[1].split(",");
-                addValuesToMap(newMap, n, Arrays.asList(features));
-            }
-            this.bundleFeatureMap = newMap;
-        }
-
-        // feature id to regions
-        valObj = props.get(PROP_featureRegions);
-        if ( valObj != null ) {
-            final Map<String, Set<String>> newMap = new HashMap<>(this.featureRegionMap);
-            for(final String val : convert(valObj)) {
-                final String[] parts = val.split("=");
-                final String n = parts[0];
-                final String[] regions = parts[1].split(",");
-                addValuesToMap(newMap, n, Arrays.asList(regions));
-            }
-            this.featureRegionMap = newMap;
-        }
-
-        // region to packages
-        valObj = props.get(PROP_regionPackage);
-        if ( valObj != null ) {
-            final Map<String, Set<String>> newMap = new HashMap<>(this.regionPackageMap);
-            for(final String val : convert(valObj)) {
-                final String[] parts = val.split("=");
-                final String n = parts[0];
-                final String[] packages = parts[1].split(",");
-                addValuesToMap(newMap, n, Arrays.asList(packages));
-            }
-            this.regionPackageMap = newMap;
-        }
+        updateConfiguration();
     }
 
     /**
@@ -388,57 +367,7 @@
     public void removeConfig(final String pid) {
         final Dictionary<String, Object> props = this.factoryConfigs.remove(pid);
         if ( props != null ) {
-            // bundle id to bsnver
-            Object valObj = props.get(PROP_idbsnver);
-            if ( valObj != null ) {
-                final Map<Map.Entry<String, Version>, List<String>> newMap = new HashMap<>(this.bsnVerMap);
-                for(final String val : convert(valObj)) {
-                    final String[] parts = val.split("=");
-                    final String n = parts[0];
-                    final String[] bsnver = parts[1].split("~");
-                    removeBsnVerArtifact(newMap, bsnver[0], bsnver[1], n);
-                }
-                this.bsnVerMap = newMap;
-            }
-
-            // bundle id to features
-            valObj = props.get(PROP_bundleFeatures);
-            if ( valObj != null ) {
-                final Map<String, Set<String>> newMap = new HashMap<>(this.bundleFeatureMap);
-                for(final String val : convert(valObj)) {
-                    final String[] parts = val.split("=");
-                    final String n = parts[0];
-                    final String[] features = parts[1].split(",");
-                    removeValuesFromMap(newMap, n, Arrays.asList(features));
-                }
-                this.bundleFeatureMap = newMap;
-            }
-
-            // feature id to regions
-            valObj = props.get(PROP_featureRegions);
-            if ( valObj != null ) {
-                final Map<String, Set<String>> newMap = new HashMap<>(this.featureRegionMap);
-                for(final String val : convert(valObj)) {
-                    final String[] parts = val.split("=");
-                    final String n = parts[0];
-                    final String[] regions = parts[1].split(",");
-                    removeValuesFromMap(newMap, n, Arrays.asList(regions));
-                }
-                this.featureRegionMap = newMap;
-            }
-
-            // region to packages
-            valObj = props.get(PROP_regionPackage);
-            if ( valObj != null ) {
-                final Map<String, Set<String>> newMap = new HashMap<>(this.regionPackageMap);
-                for(final String val : convert(valObj)) {
-                    final String[] parts = val.split("=");
-                    final String n = parts[0];
-                    final String[] packages = parts[1].split(",");
-                    removeValuesFromMap(newMap, n, Arrays.asList(packages));
-                }
-                this.regionPackageMap = newMap;
-            }
+            updateConfiguration();
         }
     }
 }
diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConstants.java b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConstants.java
new file mode 100644
index 0000000..f4b8784
--- /dev/null
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionConstants.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.feature.apiregions.impl;
+
+abstract class RegionConstants {
+
+    static final String GLOBAL_REGION = "global";
+
+    static final String CLASSLOADER_PSEUDO_PROTOCOL = "classloader://";
+    static final String APIREGIONS_JOINGLOBAL = "sling.feature.apiregions.joinglobal";
+    static final String DEFAULT_REGIONS = "sling.feature.apiregions.default";
+    static final String PROPERTIES_RESOURCE_PREFIX = "sling.feature.apiregions.resource.";
+    static final String PROPERTIES_FILE_LOCATION = "sling.feature.apiregions.location";
+
+    static final String IDBSNVER_FILENAME = "idbsnver.properties";
+    static final String BUNDLE_FEATURE_FILENAME = "bundles.properties";
+    static final String FEATURE_REGION_FILENAME = "features.properties";
+    static final String REGION_PACKAGE_FILENAME = "regions.properties";
+
+    static final String PROP_idbsnver = "mapping.bundleid.bsnver";
+    static final String PROP_bundleFeatures = "mapping.bundleid.features";
+    static final String PROP_featureRegions = "mapping.featureid.regions";
+    static final String PROP_regionPackage = "mapping.region.packages";
+}
diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java b/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
index 3c1f4b3..556ff34 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
@@ -115,7 +115,7 @@
             List<String> capBundleArtifacts = this.configuration.getBsnVerMap().get(new AbstractMap.SimpleEntry<String, Version>(capBundleName, capBundleVersion));
             if (capBundleArtifacts == null) {
                 // Capability is not in any feature, everyone can access
-                coveredCaps.put(bc, RegionConfiguration.GLOBAL_REGION);
+                coveredCaps.put(bc, RegionConstants.GLOBAL_REGION);
                 continue nextCapability;
             }
 
@@ -132,7 +132,7 @@
             for (String capFeat : capFeatures) {
                 if (capFeat == null) {
                     // everyone can access capability not coming from a feature
-                    coveredCaps.put(bc, RegionConfiguration.GLOBAL_REGION);
+                    coveredCaps.put(bc, RegionConstants.GLOBAL_REGION);
                     continue nextCapability;
                 }
 
@@ -145,7 +145,7 @@
                 Set<String> capRegions = this.configuration.getFeatureRegionMap().get(capFeat);
                 if (capRegions == null || capRegions.size() == 0) {
                     // If the feature hosting the capability has no regions defined, everyone can access
-                    coveredCaps.put(bc, RegionConfiguration.GLOBAL_REGION);
+                    coveredCaps.put(bc, RegionConstants.GLOBAL_REGION);
                     continue nextCapability;
                 }
                 bcFeatureMap.put(bc, capFeat);
@@ -168,10 +168,10 @@
                     }
 
                     // Now check the global region
-                    Set<String> globalPackages = this.configuration.getRegionPackageMap().get(RegionConfiguration.GLOBAL_REGION);
+                    Set<String> globalPackages = this.configuration.getRegionPackageMap().get(RegionConstants.GLOBAL_REGION);
                     if (globalPackages != null && globalPackages.contains(packageName)) {
                         // If the export is in the global region everyone can access
-                        coveredCaps.put(bc, RegionConfiguration.GLOBAL_REGION);
+                        coveredCaps.put(bc, RegionConstants.GLOBAL_REGION);
                         continue nextCapability;
                     }
                 }
@@ -220,7 +220,7 @@
      */
     private void pruneCoveredCaps(Set<String> reqRegions, Map<BundleCapability,String> capMap) {
         Set<String> reqNonGlobalRegions = new HashSet<>(reqRegions);
-        reqNonGlobalRegions.remove(RegionConfiguration.GLOBAL_REGION);
+        reqNonGlobalRegions.remove(RegionConstants.GLOBAL_REGION);
 
         if (capMap.size() <= 1) {
             // Shortcut: there is only 0 or 1 capability, nothing to do
@@ -228,7 +228,7 @@
         }
 
         if (reqRegions.size() == 0
-                || Collections.singleton(RegionConfiguration.GLOBAL_REGION).equals(reqRegions)) {
+                || Collections.singleton(RegionConstants.GLOBAL_REGION).equals(reqRegions)) {
             // No regions (other than global) for the requirement: do nothing
             return;
         }
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
index 44f9d2f..df86a4e 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/ActivatorTest.java
@@ -18,11 +18,11 @@
  */
 package org.apache.sling.feature.apiregions.impl;
 
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.BUNDLE_FEATURE_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.FEATURE_REGION_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.IDBSNVER_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.PROPERTIES_RESOURCE_PREFIX;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.REGION_PACKAGE_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.BUNDLE_FEATURE_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.FEATURE_REGION_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.IDBSNVER_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.PROPERTIES_RESOURCE_PREFIX;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.REGION_PACKAGE_FILENAME;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -185,7 +185,7 @@
         BundleContext bc = Mockito.mock(BundleContext.class);
         Mockito.when(bc.getBundle()).thenReturn(fw);
         Mockito.when(bc.getProperty(Activator.REGIONS_PROPERTY_NAME)).thenReturn("*");
-        Mockito.when(bc.getProperty(RegionConfiguration.PROPERTIES_FILE_LOCATION)).thenReturn(resourceDir);
+        Mockito.when(bc.getProperty(RegionConstants.PROPERTIES_FILE_LOCATION)).thenReturn(resourceDir);
         Mockito.when(bc.registerService(
             Mockito.eq("org.osgi.service.cm.ManagedService"),
             Mockito.any(),
@@ -207,7 +207,7 @@
 
         Activator a = new Activator();
         a.bundleContext = bc;
-        a.configuration = new RegionConfiguration(null, null, null, null, null);
+        a.configuration = new RegionConfiguration(Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap(), Collections.emptySet());
         FrameworkEvent ev = Mockito.mock(FrameworkEvent.class);
         Mockito.when(ev.getType()).thenReturn(FrameworkEvent.STARTED);
 
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/RegionConfigurationTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/RegionConfigurationTest.java
index d0cd62e..5c0d8b2 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/RegionConfigurationTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/RegionConfigurationTest.java
@@ -18,14 +18,14 @@
  */
 package org.apache.sling.feature.apiregions.impl;
 
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.APIREGIONS_JOINGLOBAL;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.BUNDLE_FEATURE_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.DEFAULT_REGIONS;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.FEATURE_REGION_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.IDBSNVER_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.PROPERTIES_FILE_LOCATION;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.PROPERTIES_RESOURCE_PREFIX;
-import static org.apache.sling.feature.apiregions.impl.RegionConfiguration.REGION_PACKAGE_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.APIREGIONS_JOINGLOBAL;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.BUNDLE_FEATURE_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.DEFAULT_REGIONS;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.FEATURE_REGION_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.IDBSNVER_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.PROPERTIES_FILE_LOCATION;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.PROPERTIES_RESOURCE_PREFIX;
+import static org.apache.sling.feature.apiregions.impl.RegionConstants.REGION_PACKAGE_FILENAME;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
index ebec9e1..57899ce 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
@@ -345,7 +345,7 @@
         bfmap.put("b20", Collections.singleton("f4"));
 
         Map<String, Set<String>> frmap = new HashMap<>();
-        frmap.put("f", new HashSet<>(Arrays.asList("r1", "r2", RegionConfiguration.GLOBAL_REGION)));
+        frmap.put("f", new HashSet<>(Arrays.asList("r1", "r2", RegionConstants.GLOBAL_REGION)));
         frmap.put("f1", Collections.singleton("r1"));
         frmap.put("f2", Collections.singleton("r2"));
         frmap.put("f3", Collections.singleton("r3"));
@@ -354,7 +354,7 @@
         Map<String, Set<String>> rpmap = new HashMap<>();
         rpmap.put("r0", Collections.singleton("org.bar"));
         rpmap.put("r1", new HashSet<>(Arrays.asList("org.blah", "org.foo")));
-        rpmap.put(RegionConfiguration.GLOBAL_REGION, Collections.singleton("org.bar.tar"));
+        rpmap.put(RegionConstants.GLOBAL_REGION, Collections.singleton("org.bar.tar"));
         rpmap.put("r3", Collections.singleton("xyz"));
 
         ResolverHookImpl rh = new ResolverHookImpl(new RegionConfiguration(bsnvermap, bfmap, frmap, rpmap, Collections.emptySet()));
@@ -485,13 +485,13 @@
 
         Map<String, Set<String>> frmap = new HashMap<>();
         frmap.put("f1", new HashSet<>(Arrays.asList(
-                RegionConfiguration.GLOBAL_REGION, "org.foo.blah")));
+                RegionConstants.GLOBAL_REGION, "org.foo.blah")));
         frmap.put("f2", new HashSet<>(Arrays.asList("org.foo.bar",
-                RegionConfiguration.GLOBAL_REGION, "org.foo.blah")));
+                RegionConstants.GLOBAL_REGION, "org.foo.blah")));
 
         Map<String, Set<String>> rpmap = new HashMap<>();
         rpmap.put("org.foo.bar", Collections.singleton("org.test"));
-        rpmap.put(RegionConfiguration.GLOBAL_REGION, Collections.singleton("org.something"));
+        rpmap.put(RegionConstants.GLOBAL_REGION, Collections.singleton("org.something"));
         rpmap.put("org.foo.blah", Collections.singleton("org.something"));
 
         ResolverHookImpl rh = new ResolverHookImpl(new RegionConfiguration(bsnvermap, bfmap, frmap, rpmap, Collections.emptySet()));
