diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java b/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
index 010efec..e86c38a 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/Activator.java
@@ -24,6 +24,7 @@
 
 import java.util.Dictionary;
 import java.util.Hashtable;
+import java.util.logging.Level;
 
 public class Activator implements BundleActivator {
     static final String REGIONS_PROPERTY_NAME = "org.apache.sling.feature.apiregions.regions";
@@ -35,8 +36,12 @@
             return; // Component not enabled
 
         Dictionary<String, Object> props = new Hashtable<>();
-        RegionEnforcer enforcer = new RegionEnforcer(context, props, regions);
-        context.registerService(ResolverHookFactory.class, enforcer, props);
+        try {
+            RegionEnforcer enforcer = new RegionEnforcer(context, props, regions);
+            context.registerService(ResolverHookFactory.class, enforcer, props);
+        } catch (Exception e) {
+            RegionEnforcer.LOG.log(Level.SEVERE, "Problem activating API Regions runtime enforcement component", e);
+        }
     }
 
     @Override
diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java
index badaa5c..f4ecaec 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/RegionEnforcer.java
@@ -40,7 +40,6 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.Set;
 import java.util.logging.Logger;
@@ -51,8 +50,6 @@
     static final String CLASSLOADER_PSEUDO_PROTOCOL = "classloader://";
     static final String PROPERTIES_RESOURCE_PREFIX = "sling.feature.apiregions.resource.";
     static final String PROPERTIES_FILE_LOCATION = "sling.feature.apiregions.location";
-    static final String SYNTHESIZED_BUNDLES_KEY = "sling.feature.apiregions.bundles";
-    static final String SYNTHESIZED_FEATURE = "org.apache.sling:org.apache.sling.feature.synthesized:0.0.0-SNAPSHOT";
 
     static final String IDBSNVER_FILENAME = "idbsnver.properties";
     static final String BUNDLE_FEATURE_FILENAME = "bundles.properties";
@@ -99,54 +96,9 @@
 
         enabledRegions = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(regionsProp.split(","))));
 
-        loadRegionsFromProperties(context, bsnVerMap, bundleFeatureMap, featureRegionMap);
         // TODO fix all collections
     }
 
-    private static void loadRegionsFromProperties(BundleContext context,
-            Map<Entry<String, Version>, List<String>> bsnVerMap,
-            Map<String, Set<String>> bundleFeatureMap,
-            Map<String, Set<String>> featureRegionMap) {
-        String prop = context.getProperty(SYNTHESIZED_BUNDLES_KEY);
-        if (prop == null)
-            return;
-
-        for (String bundle : prop.split(",")) {
-            String[] bundleinfo = bundle.split("=");
-            if (bundleinfo.length != 2) {
-                LOG.severe("Incorrect bundle info '" + bundle + "' in " + prop);
-                continue;
-            }
-
-            String bsnver = bundleinfo[0];
-            String info = bundleinfo[1];
-
-            String[] bsnver1 = bsnver.split(":");
-            if (bsnver1.length != 2) {
-                LOG.severe("Incorrect bsn and version '" + bsnver + "' in " + prop);
-                continue;
-            }
-
-            String bsn = bsnver1[0];
-            String ver = bsnver1[1];
-
-            String[] aidregion = info.split(";");
-            if (aidregion.length != 2) {
-                LOG.severe("Incorrect artifact and region '" + aidregion + "' in " + prop);
-                continue;
-            }
-
-            String aid = aidregion[0];
-            String region = aidregion[1];
-
-            addBsnVerArtifact(bsnVerMap, bsn, ver, aid);
-            addValuesToMap(bundleFeatureMap, aid, SYNTHESIZED_FEATURE);
-            addValuesToMap(featureRegionMap, SYNTHESIZED_FEATURE, region);
-
-            LOG.info("Added bundle " +  bsnver + " as " + aid + " to feature " + region);
-        }
-    }
-
     private static Map<Map.Entry<String, Version>, List<String>> populateBSNVerMap(URI idbsnverFile) throws IOException {
         if (idbsnverFile == null) {
             return new HashMap<>();
@@ -231,7 +183,8 @@
         }
 
         if (fn == null)
-            return null;
+            throw new IOException("API Region Enforcement enabled, but no configuration found to find "
+                    + "region definition resource: " + name);
 
         if (fn.contains(":")) {
             if (fn.startsWith(CLASSLOADER_PSEUDO_PROTOCOL)) {
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 9a279fd..c2f13d1 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
@@ -30,8 +30,11 @@
 import java.util.Hashtable;
 import java.util.Properties;
 
+import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.BUNDLE_FEATURE_FILENAME;
 import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.FEATURE_REGION_FILENAME;
+import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.IDBSNVER_FILENAME;
 import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.PROPERTIES_RESOURCE_PREFIX;
+import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.REGION_PACKAGE_FILENAME;
 
 public class ActivatorTest {
     private Properties savedProps;
@@ -50,15 +53,27 @@
 
     @Test
     public void testStart() throws Exception {
+        String i = getClass().getResource("/idbsnver1.properties").getFile();
+        String b = getClass().getResource("/bundles1.properties").getFile();
         String f = getClass().getResource("/features1.properties").getFile();
+        String r = getClass().getResource("/regions1.properties").getFile();
 
         Dictionary<String, Object> expectedProps = new Hashtable<>();
+        expectedProps.put(IDBSNVER_FILENAME, new File(i).toURI().toString());
+        expectedProps.put(BUNDLE_FEATURE_FILENAME, new File(b).toURI().toString());
         expectedProps.put(FEATURE_REGION_FILENAME, new File(f).toURI().toString());
+        expectedProps.put(REGION_PACKAGE_FILENAME, new File(r).toURI().toString());
 
         BundleContext bc = Mockito.mock(BundleContext.class);
         Mockito.when(bc.getProperty(Activator.REGIONS_PROPERTY_NAME)).thenReturn("*");
+        Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + IDBSNVER_FILENAME)).
+            thenReturn(i);
+        Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + BUNDLE_FEATURE_FILENAME)).
+            thenReturn(b);
         Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + FEATURE_REGION_FILENAME)).
             thenReturn(f);
+        Mockito.when(bc.getProperty(PROPERTIES_RESOURCE_PREFIX + REGION_PACKAGE_FILENAME)).
+            thenReturn(r);
 
         Activator a = new Activator();
         a.start(bc);
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java
index 2962cb4..45192bd 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/RegionEnforcerTest.java
@@ -30,8 +30,6 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Hashtable;
-import java.util.List;
-import java.util.Set;
 
 import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.BUNDLE_FEATURE_FILENAME;
 import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.FEATURE_REGION_FILENAME;
@@ -39,27 +37,33 @@
 import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.PROPERTIES_FILE_LOCATION;
 import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.PROPERTIES_RESOURCE_PREFIX;
 import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.REGION_PACKAGE_FILENAME;
-import static org.apache.sling.feature.apiregions.impl.RegionEnforcer.SYNTHESIZED_BUNDLES_KEY;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 public class RegionEnforcerTest {
     @Test
     public void testRegionEnforcerNoConfiguration() throws Exception {
         BundleContext ctx = Mockito.mock(BundleContext.class);
 
-        RegionEnforcer re = new RegionEnforcer(ctx, new Hashtable<String, Object>(), "*");
-        assertEquals(0, re.bsnVerMap.size());
-        assertEquals(0, re.bundleFeatureMap.size());
-        assertEquals(0, re.featureRegionMap.size());
-        assertEquals(0, re.regionPackageMap.size());
+        RegionEnforcer re;
+        try {
+            re = new RegionEnforcer(ctx, new Hashtable<String, Object>(), "*");
+            fail("Expected exception. Enforcer is enabled but is missing configuration");
+        } catch (Exception e) {
+            // good
+        }
     }
 
     @Test
     public void testLoadBSNVerMap() throws Exception {
+        String e = getClass().getResource("/empty.properties").getFile();
         String f = getClass().getResource("/idbsnver1.properties").getFile();
         BundleContext ctx = Mockito.mock(BundleContext.class);
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + IDBSNVER_FILENAME)).thenReturn(f);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + BUNDLE_FEATURE_FILENAME)).thenReturn(e);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + FEATURE_REGION_FILENAME)).thenReturn(e);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + REGION_PACKAGE_FILENAME)).thenReturn(e);
 
         Hashtable<String, Object> props = new Hashtable<>();
         RegionEnforcer re = new RegionEnforcer(ctx, props, "*");
@@ -73,9 +77,13 @@
 
     @Test
     public void testLoadBundleFeatureMap() throws Exception {
+        String e = getClass().getResource("/empty.properties").getFile();
         String f = getClass().getResource("/bundles1.properties").getFile();
         BundleContext ctx = Mockito.mock(BundleContext.class);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + IDBSNVER_FILENAME)).thenReturn(e);
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + BUNDLE_FEATURE_FILENAME)).thenReturn(f);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + FEATURE_REGION_FILENAME)).thenReturn(e);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + REGION_PACKAGE_FILENAME)).thenReturn(e);
 
         Hashtable<String, Object> props = new Hashtable<>();
         RegionEnforcer re = new RegionEnforcer(ctx, props, "*");
@@ -91,9 +99,13 @@
 
     @Test
     public void testLoadFeatureRegionMap() throws Exception {
+        String e = getClass().getResource("/empty.properties").getFile();
         String f = getClass().getResource("/features1.properties").getFile();
         BundleContext ctx = Mockito.mock(BundleContext.class);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + IDBSNVER_FILENAME)).thenReturn(e);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + BUNDLE_FEATURE_FILENAME)).thenReturn(e);
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + FEATURE_REGION_FILENAME)).thenReturn(f);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + REGION_PACKAGE_FILENAME)).thenReturn(e);
 
         Hashtable<String, Object> props = new Hashtable<>();
         RegionEnforcer re = new RegionEnforcer(ctx, props, "*");
@@ -107,8 +119,12 @@
 
     @Test
     public void testLoadRegionPackageMap() throws Exception {
+        String e = getClass().getResource("/empty.properties").getFile();
         String f = getClass().getResource("/regions1.properties").getFile();
         BundleContext ctx = Mockito.mock(BundleContext.class);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + IDBSNVER_FILENAME)).thenReturn(e);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + BUNDLE_FEATURE_FILENAME)).thenReturn(e);
+        Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + FEATURE_REGION_FILENAME)).thenReturn(e);
         Mockito.when(ctx.getProperty(PROPERTIES_RESOURCE_PREFIX + REGION_PACKAGE_FILENAME)).thenReturn(f);
 
         Hashtable<String, Object> props = new Hashtable<>();
@@ -183,38 +199,4 @@
         assertEquals(Arrays.asList("r0", "r1", "r2", "r3"),
                 new ArrayList<>(re.featureRegionMap.get("org.sling:something:1.2.3")));
     }
-
-    @Test
-    public void testFrameworkPropertyBundleRegions() throws Exception {
-        BundleContext ctx = Mockito.mock(BundleContext.class);
-        Mockito.when(ctx.getProperty(SYNTHESIZED_BUNDLES_KEY)).thenReturn(
-                "org.foo.bar:1.2.3=org.foo:bar:1.2.3;myregion," +
-                "org.foo.jar:1.0.0=org.foo:jar:1.0.0;myregion");
-
-        RegionEnforcer re = new RegionEnforcer(ctx, new Hashtable<String, Object>(), "*");
-
-        assertTrue(re.bsnVerMap.size() == 2);
-        List<String> al1 = re.bsnVerMap.get(new AbstractMap.SimpleEntry<>(
-                "org.foo.bar", Version.valueOf("1.2.3")));
-        assertEquals(1, al1.size());
-        String a1 = al1.iterator().next();
-
-        List<String> al2 = re.bsnVerMap.get(new AbstractMap.SimpleEntry<>(
-                "org.foo.jar", Version.valueOf("1.0.0")));
-        assertEquals(1, al2.size());
-        String a2 = al2.iterator().next();
-
-        Set<String> fl1 = re.bundleFeatureMap.get(a1);
-        assertEquals(1, fl1.size());
-        String f1 = fl1.iterator().next();
-        Set<String> fl2 = re.bundleFeatureMap.get(a2);
-        assertEquals(1, fl2.size());
-        String f2 = fl2.iterator().next();
-        assertEquals(f1, f2);
-
-        Set<String> rl = re.featureRegionMap.get(f1);
-        assertEquals(1, rl.size());
-        String r = rl.iterator().next();
-        assertEquals("myregion", r);
-    }
 }
diff --git a/src/test/resources/empty.properties b/src/test/resources/empty.properties
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/test/resources/empty.properties
@@ -0,0 +1 @@
+
