diff --git a/pom.xml b/pom.xml
index c051ab4..9debc0b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,13 +62,13 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.feature</artifactId>
-            <version>1.1.0</version>
+            <version>1.1.1-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.feature.analyser</artifactId>
-            <version>1.1.0</version>
+            <version>1.2.3-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -99,8 +99,14 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.feature.io</artifactId>
-            <version>1.0.4</version>
+            <version>1.2.1-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.utils</artifactId>
+            <version>1.11.2</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/APIRegionMergeHandler.java b/src/main/java/org/apache/sling/feature/extension/apiregions/APIRegionMergeHandler.java
index feb37b9..2ad9647 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/APIRegionMergeHandler.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/APIRegionMergeHandler.java
@@ -16,18 +16,12 @@
  */
 package org.apache.sling.feature.extension.apiregions;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.List;
-import java.util.Properties;
-import java.util.stream.Collectors;
-
+import java.util.LinkedHashSet;
 import javax.json.JsonArray;
 
-import org.apache.sling.feature.Artifact;
+import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.Feature;
 import org.apache.sling.feature.builder.HandlerContext;
@@ -53,13 +47,9 @@
         if (targetEx != null && !targetEx.getName().equals(ApiRegions.EXTENSION_NAME))
             return;
 
-        storeBundleOrigins(context, source, target);
-
         try {
             final ApiRegions srcRegions = ApiRegions.parse((JsonArray) sourceEx.getJSONStructure());
 
-            storeRegionOrigins(context, source, target, srcRegions);
-
             final ApiRegions targetRegions;
             if (targetEx != null) {
                 targetRegions = ApiRegions.parse((JsonArray) targetEx.getJSONStructure());
@@ -79,11 +69,17 @@
                             targetRegion.add(srcExp);
                         }
                     }
+                    LinkedHashSet<ArtifactId> origins = new LinkedHashSet<>(Arrays.asList(targetRegion.getFeatureOrigins()));
+                    origins.add(source.getId());
+                    targetRegion.setFeatureOrigins(origins.toArray(new ArtifactId[0]));
                 }
             }
 
             // If there are any remaining regions in the src extension, process them now
             for (final ApiRegion r : srcRegions.listRegions()) {
+                LinkedHashSet<ArtifactId> origins = new LinkedHashSet<>(Arrays.asList(r.getFeatureOrigins()));
+                origins.add(source.getId());
+                r.setFeatureOrigins(origins.toArray(new ArtifactId[0]));
                 if (!targetRegions.add(r)) {
                     throw new IllegalStateException("Duplicate region " + r.getName());
                 }
@@ -95,62 +91,4 @@
             throw new RuntimeException(e);
         }
     }
-
-    private void storeRegionOrigins(HandlerContext context, Feature source, Feature target, ApiRegions regions) {
-        try {
-            File f = AbstractHandler.getFeatureDataFile(context, target, "regionOrigins.properties");
-
-            Properties p = new Properties();
-            if (f.isFile()) {
-                try (FileInputStream fis = new FileInputStream(f)) {
-                    p.load(fis);
-                }
-            }
-
-            String fid = source.getId().toMvnId();
-            p.put(fid, regions.listRegions().stream().map(region -> region.getName()).collect(Collectors.joining(",")));
-
-            try (FileOutputStream fos = new FileOutputStream(f)) {
-                p.store(fos, "Mapping from feature ID to regions that the feature is a member of");
-            }
-        } catch (IOException e) {
-            throw new IllegalStateException("Problem storing region origin information", e);
-        }
-    }
-
-    private void storeBundleOrigins(HandlerContext context, Feature source, Feature target) {
-        try {
-            File f = AbstractHandler.getFeatureDataFile(context, target, "bundleOrigins.properties");
-
-            String featureId = source.getId().toMvnId();
-            Properties p = new Properties();
-            if (f.isFile()) {
-                try (FileInputStream fis = new FileInputStream(f)) {
-                    p.load(fis);
-                }
-            }
-
-            for (Artifact b : source.getBundles()) {
-                String bundleId = b.getId().toMvnId();
-                String org = p.getProperty(bundleId);
-                String newVal;
-                if (org != null) {
-                    List<String> l = Arrays.asList(org.split(","));
-                    if (!l.contains(featureId))
-                        newVal = org + "," + featureId;
-                    else
-                        newVal = org;
-                } else {
-                    newVal = featureId;
-                }
-                p.setProperty(bundleId, newVal);
-            }
-
-            try (FileOutputStream fos = new FileOutputStream(f)) {
-                p.store(fos, "Mapping from bundle artifact IDs to features that contained the bundle.");
-            }
-        } catch (IOException e) {
-            throw new IllegalStateException("Problem storing bundle origin information", e);
-        }
-    }
 }
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/AbstractHandler.java b/src/main/java/org/apache/sling/feature/extension/apiregions/AbstractHandler.java
deleted file mode 100644
index 78ddb25..0000000
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/AbstractHandler.java
+++ /dev/null
@@ -1,95 +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.sling.feature.extension.apiregions;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Date;
-import java.util.Properties;
-
-import org.apache.sling.feature.Feature;
-import org.apache.sling.feature.builder.HandlerContext;
-
-class AbstractHandler {
-    static final String GLOBAL_NAME = "global";
-
-    static final String NAME_KEY = "name";
-    static final String EXPORTS_KEY = "exports";
-
-    static final String FILE_PREFIX = "apiregions.";
-    static final String FILE_STORAGE_DIR_KEY = "fileStorage";
-
-    static final String PROPERTIES_RESOURCE_PREFIX = "sling.feature.apiregions.resource.";
-
-    protected static File getFeatureDataFile(HandlerContext context, Feature target, String fileName) throws IOException {
-        String featureName = target.getId().toMvnId().replaceAll("[^a-zA-Z0-9\\.\\-]", "_");
-        File f = AbstractHandler.getDataFile(context, featureName, fileName);
-        f.getParentFile().mkdirs();
-        return f;
-    }
-
-    protected static File getDataFile(HandlerContext context, String directory, String name) throws IOException {
-        String stg = context.getConfiguration().get(FILE_STORAGE_DIR_KEY);
-        File f;
-        if (stg != null) {
-            File dir;
-            if (directory != null) {
-                dir = new File(stg, directory);
-                dir.mkdirs();
-            } else {
-                dir = new File(stg);
-            }
-            f = new File(dir, name);
-        } else {
-            // If we store in the temp space we don't use the directory
-            Path p = Files.createTempFile(FILE_PREFIX, name);
-            f = p.toFile();
-            f.deleteOnExit();
-        }
-
-        // The feature launcher runtime picks the data file up from this system property
-        System.setProperty(PROPERTIES_RESOURCE_PREFIX + name, f.getCanonicalPath());
-        return f;
-    }
-
-    protected static File getDataFile(HandlerContext context, String name) throws IOException {
-        return getDataFile(context, null, name);
-    }
-
-    protected Properties loadProperties(File file) throws IOException, FileNotFoundException {
-        Properties map = new Properties();
-        if (file.exists()) {
-            try (InputStream is = new FileInputStream(file)) {
-                map.load(is);
-            }
-        }
-        return map;
-    }
-
-    protected void storeProperties(Properties properties, File file) throws IOException, FileNotFoundException {
-        try (OutputStream os = new FileOutputStream(file)) {
-            properties.store(os, "Generated at " + new Date());
-        }
-    }
-}
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/BundleArtifactFeatureHandler.java b/src/main/java/org/apache/sling/feature/extension/apiregions/BundleArtifactFeatureHandler.java
deleted file mode 100644
index a3df8ff..0000000
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/BundleArtifactFeatureHandler.java
+++ /dev/null
@@ -1,123 +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.sling.feature.extension.apiregions;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import javax.json.Json;
-import javax.json.JsonArray;
-import javax.json.JsonObject;
-import javax.json.JsonReader;
-import javax.json.JsonValue;
-
-import org.apache.sling.feature.Artifact;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.Feature;
-import org.apache.sling.feature.builder.HandlerContext;
-import org.apache.sling.feature.builder.PostProcessHandler;
-import org.apache.sling.feature.extension.apiregions.api.ApiRegions;
-
-public class BundleArtifactFeatureHandler extends AbstractHandler implements PostProcessHandler {
-    @Override
-    public void postProcess(HandlerContext context, Feature feature, Extension extension) {
-        if (!ApiRegions.EXTENSION_NAME.equals(extension.getName()))
-            return;
-
-        try {
-            writeBundleToFeatureMap(context, feature);
-            writeFeatureToRegionAndPackageMap(context, feature, extension);
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    private void writeBundleToFeatureMap(HandlerContext context, Feature feature) throws IOException {
-        File bundlesFile = getFeatureDataFile(context, feature, "bundles.properties");
-        Properties map = loadProperties(bundlesFile);
-
-        for (Artifact b : feature.getBundles()) {
-            String id = b.getId().toMvnId().trim();
-            String fid = feature.getId().toMvnId().trim();
-
-            String m = map.getProperty(id);
-            if (m != null) {
-                List<String> l = Arrays.asList(m.split(","));
-                if (!l.contains(fid))
-                    m = m.trim() + "," + fid;
-            } else {
-                m = fid;
-            }
-            map.put(id, m);
-        }
-
-        storeProperties(map, bundlesFile);
-    }
-
-    private void writeFeatureToRegionAndPackageMap(HandlerContext context, Feature feature, Extension extension) throws IOException {
-        try (JsonReader jr = Json.createReader(new StringReader(extension.getJSON()))) {
-            JsonArray ja = jr.readArray();
-
-            File featuresFile = getFeatureDataFile(context, feature, "features.properties");
-            File regionsFile = getFeatureDataFile(context, feature, "regions.properties");
-            Properties frMap = loadProperties(featuresFile);
-            Properties rpMap = loadProperties(regionsFile);
-
-            for (JsonValue jv : ja) {
-                if (jv instanceof JsonObject) {
-                    JsonObject jo = (JsonObject) jv;
-                    String fid = feature.getId().toMvnId();
-
-                    // Regions are ordered, so need to use a linked hash set
-                    Set<String> regionSet = new LinkedHashSet<>();
-                    String regions = frMap.getProperty(fid);
-                    if (regions != null) {
-                        regionSet.addAll(Arrays.asList(regions.split(",")));
-                    }
-                    String region = jo.getString(NAME_KEY);
-                    regionSet.add(region);
-
-                    frMap.put(fid, regionSet.stream().collect(Collectors.joining(",")));
-
-                    Set<String> packageSet = new HashSet<>();
-                    String packages = rpMap.getProperty(region);
-                    if (packages != null) {
-                        packageSet.addAll(Arrays.asList(packages.split(",")));
-                    }
-                    if (jo.containsKey(EXPORTS_KEY)) {
-                        JsonArray eja = jo.getJsonArray(EXPORTS_KEY);
-                        for (int i=0; i < eja.size(); i++) {
-                            packageSet.add(eja.getString(i));
-                        }
-                    }
-                    rpMap.put(region, packageSet.stream().collect(Collectors.joining(",")));
-                }
-            }
-
-            storeProperties(frMap, featuresFile);
-            storeProperties(rpMap, regionsFile);
-        }
-    }
-}
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/BundleMappingHandler.java b/src/main/java/org/apache/sling/feature/extension/apiregions/BundleMappingHandler.java
deleted file mode 100644
index 88ca215..0000000
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/BundleMappingHandler.java
+++ /dev/null
@@ -1,65 +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.sling.feature.extension.apiregions;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Properties;
-import java.util.jar.JarFile;
-
-import org.apache.sling.feature.Artifact;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.Feature;
-import org.apache.sling.feature.builder.HandlerContext;
-import org.apache.sling.feature.builder.PostProcessHandler;
-import org.apache.sling.feature.extension.apiregions.api.ApiRegions;
-import org.apache.sling.feature.io.IOUtils;
-import org.osgi.framework.Constants;
-
-public class BundleMappingHandler extends AbstractHandler implements PostProcessHandler {
-    @Override
-    public void postProcess(HandlerContext context, Feature feature, Extension extension) {
-        if (!ApiRegions.EXTENSION_NAME.equals(extension.getName()))
-            return;
-
-        try {
-            File idBSNFile = getFeatureDataFile(context, feature, "idbsnver.properties");
-            Properties map = loadProperties(idBSNFile);
-
-            for (Artifact b : feature.getBundles()) {
-                URL f = context.getArtifactProvider().provide(b.getId());
-
-                try (JarFile jf = IOUtils.getJarFileFromURL(f, true, null)) {
-                    String bsn = jf.getManifest().getMainAttributes().getValue(Constants.BUNDLE_SYMBOLICNAME);
-                    if (bsn == null)
-                        continue;
-
-                    String ver = jf.getManifest().getMainAttributes().getValue(Constants.BUNDLE_VERSION);
-                    if (ver == null)
-                        ver = "0.0.0";
-
-                    map.put(b.getId().toMvnId(), bsn.trim() + "~" + ver.trim());
-                }
-            }
-
-            storeProperties(map, idBSNFile);
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/AbstractApiRegionsAnalyserTask.java b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/AbstractApiRegionsAnalyserTask.java
index 916e865..adb244f 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/AbstractApiRegionsAnalyserTask.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/AbstractApiRegionsAnalyserTask.java
@@ -17,7 +17,6 @@
 package org.apache.sling.feature.extension.apiregions.analyser;
 
 import java.io.IOException;
-
 import javax.json.JsonArray;
 
 import org.apache.sling.feature.Extension;
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImports.java b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImports.java
index 2b1a884..d11e2a5 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImports.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImports.java
@@ -18,32 +18,28 @@
  */
 package org.apache.sling.feature.extension.apiregions.analyser;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.AbstractMap;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
-
+import java.util.stream.Stream;
 import javax.json.JsonArray;
 
+import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.Extensions;
 import org.apache.sling.feature.Feature;
 import org.apache.sling.feature.analyser.task.AnalyserTask;
 import org.apache.sling.feature.analyser.task.AnalyserTaskContext;
+import org.apache.sling.feature.extension.apiregions.api.ApiRegion;
 import org.apache.sling.feature.extension.apiregions.api.ApiRegions;
 import org.apache.sling.feature.scanner.BundleDescriptor;
 import org.apache.sling.feature.scanner.PackageInfo;
@@ -51,7 +47,6 @@
 
 public class CheckApiRegionsBundleExportsImports implements AnalyserTask {
 
-    private static final String FILE_STORAGE_CONFIG_KEY = "fileStorage";
     private static final String IGNORE_API_REGIONS_CONFIG_KEY = "ignoreAPIRegions";
     private static final String GLOBAL_REGION = "global";
     private static final String NO_REGION = " __NO_REGION__ ";
@@ -146,31 +141,21 @@
         if ( ctx.getFrameworkDescriptor() != null ) {
             exportingBundles.add(ctx.getFrameworkDescriptor());
         }
-
-        Map<String, Set<String>> bundleToOriginalFeatures;
-        Map<String, Set<String>> featureToOriginalRegions;
         ApiRegions apiRegions = new ApiRegions(); // Empty API Regions;
 
-        if (ignoreAPIRegions) {
-            bundleToOriginalFeatures = Collections.emptyMap();
-            featureToOriginalRegions = Collections.emptyMap();
-        } else {
-            bundleToOriginalFeatures = readBundleOrigins(ctx);
-            featureToOriginalRegions = readRegionOrigins(ctx);
-            Feature feature = ctx.getFeature();
+        Feature feature = ctx.getFeature();
 
-            // extract and check the api-regions
+        // extract and check the api-regions
 
-            Extensions extensions = feature.getExtensions();
-            Extension apiRegionsExtension = extensions.getByName(ApiRegions.EXTENSION_NAME);
-            if (apiRegionsExtension != null && apiRegionsExtension.getJSONStructure() != null) {
-                try {
-                    apiRegions = ApiRegions.parse((JsonArray) apiRegionsExtension.getJSONStructure());
-                } catch (IOException e) {
-                    ctx.reportError("API Regions '" + apiRegionsExtension.getJSON()
-                            + "' does not represent a valid JSON 'api-regions': " + e.getMessage());
-                    return;
-                }
+        Extensions extensions = feature.getExtensions();
+        Extension apiRegionsExtension = extensions.getByName(ApiRegions.EXTENSION_NAME);
+        if (apiRegionsExtension != null && apiRegionsExtension.getJSONStructure() != null) {
+            try {
+                apiRegions = ApiRegions.parse((JsonArray) apiRegionsExtension.getJSONStructure());
+            } catch (IOException e) {
+                ctx.reportError("API Regions '" + apiRegionsExtension.getJSON()
+                        + "' does not represent a valid JSON 'api-regions': " + e.getMessage());
+                return;
             }
         }
 
@@ -186,8 +171,7 @@
                 if ( info.getImportedPackages() != null ) {
                     for(final PackageInfo pck : info.getImportedPackages() ) {
                         final Map<BundleDescriptor, Set<String>> candidates =
-                                getCandidates(exportingBundles, pck, info,
-                                        bundleToOriginalFeatures, featureToOriginalRegions, apiRegions);
+                                getCandidates(exportingBundles, pck, info, apiRegions, ignoreAPIRegions);
                         if ( candidates.isEmpty() ) {
                             if ( pck.isOptional() ) {
                                 getReport(reports, info).missingExportsForOptional.add(pck);
@@ -221,7 +205,7 @@
 
                                     // Find out what regions the importing bundle is in
                                     Set<String> imRegions =
-                                            getBundleRegions(info, bundleToOriginalFeatures, featureToOriginalRegions);
+                                            getBundleRegions(info, apiRegions, ignoreAPIRegions);
 
                                     // Record the exporting and importing regions for diagnostics
                                     exportingRegions.addAll(exRegions);
@@ -291,21 +275,12 @@
         }
     }
 
-    private Set<String> getBundleRegions(BundleDescriptor info, Map<String, Set<String>> bundleToOriginalFeatures,
-            Map<String, Set<String>> featureToOriginalRegions) {
-        Set<String> result = new HashSet<>();
+    private Set<String> getBundleRegions(BundleDescriptor info, ApiRegions regions, boolean ignoreAPIRegions) {
+        Set<String> result = ignoreAPIRegions ? Collections.emptySet() : Stream.of(info.getArtifact().getFeatureOrigins())
+            .map(regions::getRegionsByFeature).flatMap(Stream::of).map(ApiRegion::getName).collect(Collectors.toSet());
 
-        Set<String> originFeatures = bundleToOriginalFeatures.get(info.getArtifact().getId().toMvnId());
-        if (originFeatures != null) {
-            for (String feature : originFeatures) {
-                Set<String> originRegions = featureToOriginalRegions.get(feature);
-                if (originRegions != null) {
-                    result.addAll(originRegions);
-                }
-            }
-        }
-
-        if (result.size() == 0) {
+        if (result.isEmpty()) {
+            result = new HashSet<>();
             result.add(NO_REGION);
         }
         return result;
@@ -343,22 +318,15 @@
             final List<BundleDescriptor> exportingBundles,
             final PackageInfo pck,
             final BundleDescriptor requestingBundle,
-            final Map<String, Set<String>> bundleToOriginalFeatures,
-            final Map<String, Set<String>> featureToOriginalRegions,
-            final ApiRegions apiRegions) throws IOException {
-        Set<String> rf = bundleToOriginalFeatures.get(
-                requestingBundle.getArtifact().getId().toMvnId());
-        if (rf == null)
-            rf = Collections.emptySet();
+            final ApiRegions apiRegions, boolean ignoreAPIRegions) {
+        Set<String> rf = ignoreAPIRegions ? Collections.emptySet() : Stream.of(requestingBundle.getArtifact().getFeatureOrigins()).map(ArtifactId::toMvnId).collect(Collectors.toSet());
+
         final Set<String> requestingFeatures = rf;
 
         final Map<BundleDescriptor, Set<String>> candidates = new HashMap<>();
         for(final BundleDescriptor info : exportingBundles) {
             if ( info.isExportingPackage(pck.getName()) ) {
-                Set<String> providingFeatures = bundleToOriginalFeatures.get(
-                        info.getArtifact().getId().toMvnId());
-                if (providingFeatures == null)
-                    providingFeatures = Collections.emptySet();
+                Set<String> providingFeatures = ignoreAPIRegions ? Collections.emptySet() : Stream.of(info.getArtifact().getFeatureOrigins()).map(ArtifactId::toMvnId).collect(Collectors.toSet());
 
                 // Compute the intersection without modifying the sets
                 Set<String> intersection = providingFeatures.stream().filter(
@@ -369,7 +337,7 @@
                     continue;
                 }
 
-                for (String region : getBundleRegions(info, bundleToOriginalFeatures, featureToOriginalRegions)) {
+                for (String region : getBundleRegions(info, apiRegions, ignoreAPIRegions)) {
                     if (!NO_REGION.equals(region) &&
                             (apiRegions.getRegionByName(region) == null
                                     || apiRegions.getRegionByName(region).getExportByName(pck.getName()) == null))
@@ -386,50 +354,4 @@
         }
         return candidates;
     }
-
-    private Map<String, Set<String>> readBundleOrigins(AnalyserTaskContext ctx) throws IOException {
-        return readOrigins(ctx, "bundleOrigins.properties");
-    }
-
-    private Map<String, Set<String>> readRegionOrigins(AnalyserTaskContext ctx) throws IOException {
-        return readOrigins(ctx, "regionOrigins.properties");
-    }
-
-    private Map<String, Set<String>> readOrigins(AnalyserTaskContext ctx, String fileName) throws IOException, FileNotFoundException {
-        Feature feature = ctx.getFeature();
-        Extension APIRegionExtension = feature.getExtensions().getByName(ApiRegions.EXTENSION_NAME);
-
-        String fileStorage = ctx.getConfiguration().get(FILE_STORAGE_CONFIG_KEY);
-        if (fileStorage == null) {
-            if (APIRegionExtension != null) {
-                throw new IllegalStateException("Feature " + feature.getId() +
-                        " has API regions defined, but no storage is configured for origin information files. "
-                        + "Please configure the " + FILE_STORAGE_CONFIG_KEY + " configuration item.");
-            }
-            return Collections.emptyMap();
-        }
-
-        String featureName = feature.getId().toMvnId().replaceAll("[^a-zA-Z0-9\\.\\-]", "_");
-        File file = new File(fileStorage, featureName + File.separator + fileName);
-        if (!file.exists()) {
-            if (APIRegionExtension != null)
-                throw new IllegalStateException("Feature " + feature.getId() +
-                        " has API regions defined but no file with origin information can be found " + file +
-                        " Configure the org.apache.sling.feature.extension.apiregions appropriately to write this information");
-            return Collections.emptyMap();
-        }
-
-        Properties p = new Properties();
-        try (InputStream is = new FileInputStream(file)) {
-            p.load(is);
-        }
-
-        Map<String, Set<String>> m = new HashMap<>();
-        for (String key : p.stringPropertyNames()) {
-            String val = p.getProperty(key);
-            String[] features = val.split(",");
-            m.put(key, new HashSet<>(Arrays.asList(features)));
-        }
-        return m;
-    }
 }
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsOrder.java b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsOrder.java
index 4396de8..bbfff43 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsOrder.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsOrder.java
@@ -19,7 +19,6 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-
 import javax.json.JsonArray;
 
 import org.apache.sling.feature.Extension;
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/api/ApiRegion.java b/src/main/java/org/apache/sling/feature/extension/apiregions/api/ApiRegion.java
index c602a5e..e7da0b2 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/api/ApiRegion.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/api/ApiRegion.java
@@ -17,11 +17,17 @@
 package org.apache.sling.feature.extension.apiregions.api;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.apache.sling.feature.ArtifactId;
 
 /**
  * Describes an api region
@@ -33,6 +39,8 @@
 
     private final List<ApiExport> exports = new ArrayList<>();
 
+    private final List<ArtifactId> origins = new ArrayList<>();
+
     private final Map<String, String> properties = new HashMap<>();
 
     private final String name;
@@ -59,6 +67,17 @@
         return name;
     }
 
+    public ArtifactId[] getFeatureOrigins() {
+        return origins.toArray(new ArtifactId[0]);
+    }
+
+    public void setFeatureOrigins(ArtifactId... featureOrigins) {
+        origins.clear();
+        if (featureOrigins != null) {
+            origins.addAll(Stream.of(featureOrigins).filter(Objects::nonNull).distinct().collect(Collectors.toList()));
+        }
+    }
+
     /**
      * Add the export. The export is only added if there isn't already a export with
      * the same name
@@ -183,34 +202,26 @@
         int result = 1;
         result = prime * result + ((exports == null) ? 0 : exports.hashCode());
         result = prime * result + ((name == null) ? 0 : name.hashCode());
+        result = prime * result + Arrays.hashCode(getFeatureOrigins());
         result = prime * result + ((properties == null) ? 0 : properties.hashCode());
         return result;
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
+    public boolean equals(Object o)
+    {
+        if (this == o)
+        {
             return true;
-        if (obj == null)
+        }
+        if (o == null || getClass() != o.getClass())
+        {
             return false;
-        if (getClass() != obj.getClass())
-            return false;
-        ApiRegion other = (ApiRegion) obj;
-        if (exports == null) {
-            if (other.exports != null)
-                return false;
-        } else if (!exports.equals(other.exports))
-            return false;
-        if (name == null) {
-            if (other.name != null)
-                return false;
-        } else if (!name.equals(other.name))
-            return false;
-        if (properties == null) {
-            if (other.properties != null)
-                return false;
-        } else if (!properties.equals(other.properties))
-            return false;
-        return true;
+        }
+        ApiRegion region = (ApiRegion) o;
+        return exports.equals(region.exports) &&
+            origins.equals(region.origins) &&
+            properties.equals(region.properties) &&
+            Objects.equals(name, region.name);
     }
 }
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/api/ApiRegions.java b/src/main/java/org/apache/sling/feature/extension/apiregions/api/ApiRegions.java
index 17b86b4..238b116 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/api/ApiRegions.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/api/ApiRegions.java
@@ -21,9 +21,11 @@
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-
+import java.util.Set;
+import java.util.stream.Stream;
 import javax.json.Json;
 import javax.json.JsonArray;
 import javax.json.JsonArrayBuilder;
@@ -36,6 +38,7 @@
 import javax.json.JsonValue.ValueType;
 import javax.json.JsonWriter;
 
+import org.apache.sling.feature.Artifact;
 import org.apache.sling.feature.ArtifactId;
 
 /**
@@ -155,6 +158,12 @@
         return found;
     }
 
+    public ApiRegion[] getRegionsByFeature(final ArtifactId featureId) {
+        return this.regions.stream().filter(
+            region -> Stream.of(region.getFeatureOrigins()).anyMatch(featureId::equals)
+        ).toArray(ApiRegion[]::new);
+    }
+
     /**
      * Get the names of the regions
      *
@@ -204,6 +213,14 @@
 
                 regionBuilder.add(EXPORTS_KEY, expArrayBuilder);
             }
+            ArtifactId[] origins = region.getFeatureOrigins();
+            if (origins.length > 0) {
+                final JsonArrayBuilder originBuilder = Json.createArrayBuilder();
+                for (ArtifactId origin : origins) {
+                    originBuilder.add(origin.toMvnId());
+                }
+                regionBuilder.add(Artifact.KEY_FEATURE_ORIGINS, originBuilder);
+            }
             for (final Map.Entry<String, String> entry : region.getProperties().entrySet()) {
                 regionBuilder.add(entry.getKey(), entry.getValue());
             }
@@ -296,6 +313,12 @@
                                 }
                             }
                         }
+                    } else if (entry.getKey().equals(Artifact.KEY_FEATURE_ORIGINS)) {
+                        Set<ArtifactId> origins = new LinkedHashSet<>();
+                        for (final JsonValue origin : (JsonArray) entry.getValue()) {
+                            origins.add(ArtifactId.fromMvnId(((JsonString) origin).getString()));
+                        }
+                        region.setFeatureOrigins(origins.toArray(new ArtifactId[0]));
                     } else {
                         region.getProperties().put(entry.getKey(), ((JsonString) entry.getValue()).getString());
                     }
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/APIRegionMergeHandlerTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/APIRegionMergeHandlerTest.java
index 04e967b..15c0bc6 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/APIRegionMergeHandlerTest.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/APIRegionMergeHandlerTest.java
@@ -16,25 +16,16 @@
  */
 package org.apache.sling.feature.extension.apiregions;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.StringReader;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.Collections;
 import java.util.Comparator;
-import java.util.Properties;
-
 import javax.json.Json;
 import javax.json.JsonArray;
 import javax.json.JsonReader;
 
-import org.apache.sling.feature.Artifact;
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Extension;
 import org.apache.sling.feature.ExtensionState;
@@ -48,6 +39,9 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 public class APIRegionMergeHandlerTest {
     private Path tempDir;
@@ -104,6 +98,7 @@
         global.add(new ApiExport("a.b.c"));
         global.add(new ApiExport("d.e.f"));
         global.add(new ApiExport("test"));
+        global.setFeatureOrigins(sf.getId());
         expected.add(global);
 
         ApiRegion internal = new ApiRegion("internal");
@@ -114,6 +109,7 @@
         ApiRegion something = new ApiRegion("something");
         something.add(new ApiExport("a.ha"));
         something.getProperties().put("my-key", "my-val");
+        something.setFeatureOrigins(sf.getId());
         expected.add(something);
 
         ApiRegions created = ApiRegions.parse((JsonArray) tgEx.getJSONStructure());
@@ -144,10 +140,10 @@
 
         Extension tgEx = tf.getExtensions().iterator().next();
 
-        String expectedJSON = "[{\"name\":\"global\",\"exports\":[\"a.b.c\",\"d.e.f\"]},"
-                + "{\"name\":\"deprecated\",\"exports\":[\"klm\",\"qrs\"]},"
-                + "{\"name\":\"internal\",\"exports\":[\"xyz\"]},"
-                + "{\"name\":\"forbidden\",\"exports\":[\"abc\",\"klm\"]}]";
+        String expectedJSON = "[{\"name\":\"global\",\"exports\":[\"a.b.c\",\"d.e.f\"],\"feature-origins\":[\"y:s:2\"]},"
+                + "{\"name\":\"deprecated\",\"exports\":[\"klm\",\"qrs\"],\"feature-origins\":[\"y:s:2\"]},"
+                + "{\"name\":\"internal\",\"exports\":[\"xyz\"],\"feature-origins\":[\"y:s:2\"]},"
+                + "{\"name\":\"forbidden\",\"exports\":[\"abc\",\"klm\"],\"feature-origins\":[\"y:s:2\"]}]";
         JsonReader er = Json.createReader(new StringReader(expectedJSON));
         JsonReader ar = Json.createReader(new StringReader(tgEx.getJSON()));
         JsonArray ea = er.readArray();
@@ -155,92 +151,4 @@
 
         assertEquals(ea, aa);
     }
-
-    @Test
-    public void testStoreBundleOrigins() throws Exception {
-        HandlerContext hc = Mockito.mock(HandlerContext.class);
-        Mockito.when(hc.getConfiguration()).thenReturn(
-                Collections.singletonMap(AbstractHandler.FILE_STORAGE_DIR_KEY,
-                        tempDir.toString()));
-
-        APIRegionMergeHandler armh = new APIRegionMergeHandler();
-
-        Feature tf = new Feature(ArtifactId.fromMvnId("g:t:1"));
-        Feature sf1 = new Feature(ArtifactId.fromMvnId("g:s1:1"));
-        Extension sf1Ex = new Extension(ExtensionType.JSON, "api-regions", ExtensionState.OPTIONAL);
-        sf1Ex.setJSON("[]");
-
-        sf1.getBundles().add(new Artifact(ArtifactId.fromMvnId("a:b1:1")));
-        sf1.getBundles().add(new Artifact(ArtifactId.fromMvnId("a:b2:1")));
-
-        armh.merge(hc, tf, sf1, null, sf1Ex);
-
-        Feature sf2 = new Feature(ArtifactId.fromMvnId("g:s2:1"));
-        Extension sf2Ex = new Extension(ExtensionType.JSON, "api-regions", ExtensionState.OPTIONAL);
-        sf2Ex.setJSON("[]");
-
-        sf2.getBundles().add(new Artifact(ArtifactId.fromMvnId("a:b2:1")));
-        sf2.getBundles().add(new Artifact(ArtifactId.fromMvnId("a:b3:1")));
-        sf2.getBundles().add(new Artifact(ArtifactId.fromMvnId("a:b2:1")));
-
-        armh.merge(hc, tf, sf2, tf.getExtensions().getByName("api-regions"), sf2Ex);
-
-        Feature sf3 = new Feature(ArtifactId.fromMvnId("g:s3:1"));
-        Extension sf3Ex = new Extension(ExtensionType.JSON, "api-regions", ExtensionState.OPTIONAL);
-        sf3Ex.setJSON("[]");
-
-        sf3.getBundles().add(new Artifact(ArtifactId.fromMvnId("a:b2:1")));
-
-        armh.merge(hc, tf, sf3, tf.getExtensions().getByName("api-regions"), sf3Ex);
-
-        Properties bo = new Properties();
-        bo.load(new FileInputStream(new File(tempDir.toFile(), "g_t_1/bundleOrigins.properties")));
-        assertEquals(3, bo.size());
-
-        assertEquals("g:s1:1", bo.get("a:b1:1"));
-        assertEquals("g:s1:1,g:s2:1,g:s3:1", bo.get("a:b2:1"));
-        assertEquals("g:s2:1", bo.get("a:b3:1"));
-    }
-
-    @Test
-    public void testStoreRegionOrigins() throws Exception {
-        HandlerContext hc = Mockito.mock(HandlerContext.class);
-        Mockito.when(hc.getConfiguration()).thenReturn(
-                Collections.singletonMap(AbstractHandler.FILE_STORAGE_DIR_KEY,
-                        tempDir.toString()));
-
-        APIRegionMergeHandler armh = new APIRegionMergeHandler();
-
-        Feature tf = new Feature(ArtifactId.fromMvnId("x:t:1"));
-        Feature sf1 = new Feature(ArtifactId.fromMvnId("y:s:2"));
-
-        Extension sr1Ex = new Extension(ExtensionType.JSON, "api-regions", ExtensionState.OPTIONAL);
-        sr1Ex.setJSON("[{\"name\":\"global\","
-                + "\"exports\": [\"a.b.c\",\"d.e.f\"]},"
-                + "{\"name\":\"deprecated\","
-                + "\"exports\":[\"klm\",\"#ignored\",\"qrs\"]},"
-                + "{\"name\":\"internal\","
-                + "\"exports\":[\"xyz\"]},"
-                + "{\"name\":\"forbidden\","
-                + "\"exports\":[\"abc\",\"klm\"]}]");
-
-        armh.merge(hc, tf, sf1, null, sr1Ex);
-
-        Feature sf2 = new Feature(ArtifactId.fromMvnId("z:s:1"));
-
-        Extension sr2Ex = new Extension(ExtensionType.JSON, "api-regions", ExtensionState.OPTIONAL);
-        sr2Ex.setJSON("[{\"name\":\"global\","
-                + "\"exports\": [\"g.h.i\"]},"
-                + "{\"name\":\"internal\","
-                + "\"exports\":[]},"
-                + "{\"name\":\"somethingelse\","
-                + "\"exports\":[\"qqq\"]}]");
-        armh.merge(hc, tf, sf2, tf.getExtensions().getByName("api-regions"), sr2Ex);
-
-        Properties ro = new Properties();
-        ro.load(new FileInputStream(new File(tempDir.toFile(), "x_t_1/regionOrigins.properties")));
-        assertEquals(2, ro.size());
-        assertEquals("global,deprecated,internal,forbidden", ro.get("y:s:2"));
-        assertEquals("global,internal,somethingelse", ro.get("z:s:1"));
-    }
 }
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/BundleArtifactFeatureHandlerTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/BundleArtifactFeatureHandlerTest.java
deleted file mode 100644
index a4f465e..0000000
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/BundleArtifactFeatureHandlerTest.java
+++ /dev/null
@@ -1,152 +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.sling.feature.extension.apiregions;
-
-import org.apache.sling.feature.Artifact;
-import org.apache.sling.feature.ArtifactId;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.ExtensionType;
-import org.apache.sling.feature.Feature;
-import org.apache.sling.feature.builder.ArtifactProvider;
-import org.apache.sling.feature.builder.HandlerContext;
-import org.junit.Test;
-
-import java.io.FileReader;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Properties;
-
-import static org.junit.Assert.assertEquals;
-
-public class BundleArtifactFeatureHandlerTest {
-    @Test
-    public void testBundleToFeatureMap() throws Exception {
-        BundleArtifactFeatureHandler bafh = new BundleArtifactFeatureHandler();
-
-        Feature f = new Feature(ArtifactId.fromMvnId("org.sling:something:1.2.3:slingosgifeature:myclassifier"));
-        Artifact b1 = new Artifact(ArtifactId.fromMvnId("org.sling:b1:1"));
-        Artifact b2 = new Artifact(ArtifactId.fromMvnId("org.sling:b2:1"));
-        Artifact b3a = new Artifact(ArtifactId.fromMvnId("org.sling:b3:1"));
-        Artifact b3b = new Artifact(ArtifactId.fromMvnId("org.sling:b3:1"));
-        f.getBundles().addAll(Arrays.asList(b1, b2, b3a, b3b));
-
-        Extension ex = new Extension(ExtensionType.JSON, "api-regions", false);
-        ex.setJSON("[]");
-        bafh.postProcess(new TestHandlerContextImpl(), f, ex);
-
-        String p = System.getProperty("sling.feature.apiregions.resource.bundles.properties");
-        Properties actual = new Properties();
-        actual.load(new FileReader(p));
-
-        Properties expected = new Properties();
-        expected.put("org.sling:b1:1", "org.sling:something:1.2.3:slingosgifeature:myclassifier");
-        expected.put("org.sling:b2:1", "org.sling:something:1.2.3:slingosgifeature:myclassifier");
-        expected.put("org.sling:b3:1", "org.sling:something:1.2.3:slingosgifeature:myclassifier");
-        assertEquals(expected, actual);
-    }
-
-    @Test
-    public void testFeatureToRegionMap() throws Exception {
-        BundleArtifactFeatureHandler bafh = new BundleArtifactFeatureHandler();
-
-        Feature f = new Feature(ArtifactId.fromMvnId("org.sling:something:1.2.3"));
-        Extension ex = new Extension(ExtensionType.JSON, "api-regions", false);
-        ex.setJSON("[{\"name\":\"global\","
-                + "\"exports\": [\"a.b.c\",\"d.e.f\"]},"
-                + "{\"name\":\"internal\","
-                + "\"exports\":[\"xyz\"]},"
-                + "{\"name\":\"global\","
-                + "\"exports\":[\"test\"]}]");
-
-        bafh.postProcess(new TestHandlerContextImpl(), f, ex);
-
-        String p = System.getProperty("sling.feature.apiregions.resource.features.properties");
-        Properties actual = new Properties();
-        actual.load(new FileReader(p));
-
-        Properties expected = new Properties();
-        expected.put("org.sling:something:1.2.3", "internal,global");
-
-        String[] al = ((String) actual.remove("org.sling:something:1.2.3")).split(",");
-        String[] el = ((String) expected.remove("org.sling:something:1.2.3")).split(",");
-        assertEquals(new HashSet<>(Arrays.asList(el)), new HashSet<>(Arrays.asList(al)));
-        assertEquals(expected, actual);
-
-        String p2 = System.getProperty("sling.feature.apiregions.resource.regions.properties");
-        Properties actual2 = new Properties();
-        actual2.load(new FileReader(p2));
-
-        Properties expected2 = new Properties();
-        expected2.put("internal", "xyz");
-        expected2.put("global", "test,a.b.c,d.e.f");
-
-        String[] agl2 = ((String) actual2.remove("global")).split(",");
-        String[] egl2 = ((String) expected2.remove("global")).split(",");
-        assertEquals(new HashSet<>(Arrays.asList(egl2)), new HashSet<>(Arrays.asList(agl2)));
-        assertEquals(expected2, actual2);
-    }
-
-    @Test
-    public void testRegionOrdering() throws Exception {
-        BundleArtifactFeatureHandler bafh = new BundleArtifactFeatureHandler();
-
-        Feature f = new Feature(ArtifactId.fromMvnId("org.sling:somethingelse:1.0.0"));
-        Extension ex = new Extension(ExtensionType.JSON, "api-regions", false);
-        ex.setJSON("[{\"name\":\"global\","
-                + "\"exports\": []},"
-                + "{\"name\":\"internal\","
-                + "\"exports\":[]},"
-                + "{\"name\":\"private\","
-                + "\"exports\":[]},"
-                + "{\"name\":\"forbidden\","
-                + "\"exports\":[]}]");
-
-        bafh.postProcess(new TestHandlerContextImpl(), f, ex);
-
-        String p = System.getProperty("sling.feature.apiregions.resource.features.properties");
-        Properties actual = new Properties();
-        actual.load(new FileReader(p));
-
-        Properties expected = new Properties();
-        expected.put("org.sling:somethingelse:1.0.0", "global,internal,private,forbidden");
-        assertEquals(expected, actual);
-    }
-
-    @Test
-    public void testUnrelatedExtension() {
-        BundleArtifactFeatureHandler bafh = new BundleArtifactFeatureHandler();
-        Extension ex = new Extension(ExtensionType.JSON, "foobar", false);
-        bafh.postProcess(null, null, ex);
-        // Should not do anything and definitely not throw an exception
-    }
-
-    private static class TestHandlerContextImpl implements HandlerContext {
-        private final Map<String, String> cfg = new HashMap<>();
-
-        @Override
-        public ArtifactProvider getArtifactProvider() {
-            return null;
-        }
-
-        @Override
-        public Map<String, String> getConfiguration() {
-            return cfg;
-        }
-    }
-}
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/BundleMappingHandlerTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/BundleMappingHandlerTest.java
deleted file mode 100644
index 99c2042..0000000
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/BundleMappingHandlerTest.java
+++ /dev/null
@@ -1,160 +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.sling.feature.extension.apiregions;
-
-import org.apache.sling.feature.Artifact;
-import org.apache.sling.feature.ArtifactId;
-import org.apache.sling.feature.Extension;
-import org.apache.sling.feature.ExtensionType;
-import org.apache.sling.feature.Feature;
-import org.apache.sling.feature.builder.ArtifactProvider;
-import org.apache.sling.feature.builder.HandlerContext;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class BundleMappingHandlerTest {
-    @Test
-    public void testHandler() throws IOException {
-        ArtifactProvider ap = new ArtifactProvider() {
-            @Override
-            public URL provide(ArtifactId id) {
-                switch(id.toMvnId()) {
-                case "g:b1:1":
-                    return getResourceFile("b1/b1.jar");
-                case "g:b2:1.2.3":
-                    return getResourceFile("b2/b2.jar");
-                case "g:b3:0":
-                    return getResourceFile("b3/b3.jar");
-                default: return null;
-                }
-            }
-        };
-
-        BundleMappingHandler bmh = new BundleMappingHandler();
-
-        Extension ex = new Extension(ExtensionType.JSON, "api-regions", false);
-        Feature f = new Feature(ArtifactId.fromMvnId("foo:bar:123"));
-        Artifact b1 = new Artifact(ArtifactId.fromMvnId("g:b1:1"));
-        f.getBundles().add(b1);
-        Artifact b2 = new Artifact(ArtifactId.fromMvnId("g:b2:1.2.3"));
-        f.getBundles().add(b2);
-        Artifact b3 = new Artifact(ArtifactId.fromMvnId("g:b3:0"));
-        f.getBundles().add(b3);
-        bmh.postProcess(new TestHandlerContext(ap), f, ex);
-
-        String p = System.getProperty("sling.feature.apiregions.resource.idbsnver.properties");
-        Properties actual = new Properties();
-        actual.load(new FileReader(p));
-
-        Properties expected = new Properties();
-        expected.put("g:b1:1", "b1~1.0.0");
-        expected.put("g:b2:1.2.3", "b2~1.2.3");
-        assertEquals(expected, actual);
-    }
-
-    @Test
-    public void testSpecificDirectory() throws Exception {
-        Path tempDir = Files.createTempDirectory(getClass().getSimpleName());
-
-        try {
-            ArtifactProvider ap = new ArtifactProvider() {
-                @Override
-                public URL provide(ArtifactId id) {
-                    switch(id.toMvnId()) {
-                    case "g:b1:1":
-                        return getResourceFile("b1/b1.jar");
-                    default: return null;
-                    }
-                }
-            };
-
-            Extension ex = new Extension(ExtensionType.JSON, "api-regions", false);
-            Feature f = new Feature(ArtifactId.fromMvnId("foo:bar:123"));
-            Artifact b1 = new Artifact(ArtifactId.fromMvnId("g:b1:1"));
-            f.getBundles().add(b1);
-
-            BundleMappingHandler bmh = new BundleMappingHandler();
-            final Map<String, String> kvm = new HashMap<>();
-            kvm.put("fileStorage", tempDir.toString());
-            bmh.postProcess(new TestHandlerContext(ap,
-                    kvm), f, ex);
-
-            File expectedFile = new File(tempDir.toFile(), "foo_bar_123/idbsnver.properties");
-            assertTrue(expectedFile.exists());
-            Properties p = new Properties();
-            p.load(new FileInputStream(expectedFile));
-
-            Properties ep = new Properties();
-            ep.put("g:b1:1", "b1~1.0.0");
-            assertEquals(ep, p);
-        } finally {
-            for (File f : tempDir.toFile().listFiles()) {
-                f.delete();
-            }
-            tempDir.toFile().delete();
-        }
-    }
-
-    @Test
-    public void testUnrelatedExtension() {
-        BundleMappingHandler bmh = new BundleMappingHandler();
-        Extension ex = new Extension(ExtensionType.JSON, "foobar", false);
-        bmh.postProcess(null, null, ex);
-        // Should not do anything and definitely not throw an exception
-    }
-
-    private URL getResourceFile(String filename) {
-        return getClass().getClassLoader().getResource(filename);
-    }
-
-    private class TestHandlerContext implements HandlerContext {
-        private final ArtifactProvider artifactProvider;
-        private final Map<String, String> config;
-
-        private TestHandlerContext(ArtifactProvider ap, Map<String, String> cfg) {
-            artifactProvider = ap;
-            config = cfg;
-        }
-
-        public TestHandlerContext(ArtifactProvider ap) {
-            this(ap, new HashMap<>());
-        }
-
-        @Override
-        public ArtifactProvider getArtifactProvider() {
-            return artifactProvider;
-        }
-
-        @Override
-        public Map<String, String> getConfiguration() {
-            return config;
-        }
-    }
-}
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/AbstractApiRegionsAnalyserTaskTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/AbstractApiRegionsAnalyserTaskTest.java
index 1483e34..e8decf5 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/AbstractApiRegionsAnalyserTaskTest.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/AbstractApiRegionsAnalyserTaskTest.java
@@ -16,13 +16,6 @@
  */
 package org.apache.sling.feature.extension.apiregions.analyser;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
 import java.io.StringReader;
 import java.net.URL;
 import java.util.Collections;
@@ -30,7 +23,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.jar.Manifest;
-
 import javax.json.Json;
 import javax.json.JsonArray;
 import javax.json.JsonReader;
@@ -53,6 +45,12 @@
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public abstract class AbstractApiRegionsAnalyserTaskTest<T extends AbstractApiRegionsAnalyserTask> {
 
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImportsTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImportsTest.java
index 4600dfc..a0492fa 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImportsTest.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImportsTest.java
@@ -18,8 +18,6 @@
  */
 package org.apache.sling.feature.extension.apiregions.analyser;
 
-import static org.junit.Assert.assertEquals;
-
 import java.io.File;
 import java.io.IOException;
 import java.util.Collections;
@@ -41,6 +39,7 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.Mockito;
+import static org.junit.Assert.assertEquals;
 
 public class CheckApiRegionsBundleExportsImportsTest {
     private static File resourceRoot;
@@ -131,7 +130,7 @@
      * different region, bundle 2 is in no region.
      */
     public void testImportExportWithRegionsMissing() throws Exception {
-        String exJson = "[{\"name\": \"something\", \"exports\": [\"org.foo.b\"]}]";
+        String exJson = "[{\"name\": \"something\", \"exports\": [\"org.foo.b\"],\"feature-origins\":[\"f:f:1\"]}]";
 
         CheckApiRegionsBundleExportsImports t = new CheckApiRegionsBundleExportsImports();
 
@@ -142,15 +141,12 @@
 
         FeatureDescriptor fd = new FeatureDescriptorImpl(f);
 
-        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar");
-        fdAddBundle(fd, "g:b2:1", "test-bundle2.jar");
+        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar", f.getId());
+        fdAddBundle(fd, "g:b2:1", "test-bundle2.jar", ArtifactId.fromMvnId("f:f2:1"));
 
         AnalyserTaskContext ctx = Mockito.mock(AnalyserTaskContext.class);
         Mockito.when(ctx.getFeature()).thenReturn(f);
         Mockito.when(ctx.getFeatureDescriptor()).thenReturn(fd);
-        Mockito.when(ctx.getConfiguration()).thenReturn(
-                Collections.singletonMap("fileStorage",
-                        resourceRoot + "/origins/testImportExportWithRegionsMissing"));
         t.execute(ctx);
 
         Mockito.verify(ctx).reportError(Mockito.contains("org.foo.b"));
@@ -164,7 +160,12 @@
      * region, bundle 1 is in something region, and bundle 2 is in somethingelse region.
      */
     public void testImportExportWithRegionMismatch() throws Exception {
-        String exJson = "[{\"name\": \"something\", \"exports\": [\"org.foo.b\"]}]";
+        String exJson =
+            "["
+                + "{\"name\": \"something\", \"exports\": [\"org.foo.b\"],\"feature-origins\":[\"f:f:1\"]},"
+                + "{\"name\": \"someotherthing\", \"exports\": [],\"feature-origins\":[\"f:f:1\"]},"
+                + "{\"name\": \"somethingelse\", \"exports\": [],\"feature-origins\":[\"f:f2:1\"]}"
+            + "]";
 
         CheckApiRegionsBundleExportsImports t = new CheckApiRegionsBundleExportsImports();
 
@@ -175,11 +176,10 @@
 
         FeatureDescriptor fd = new FeatureDescriptorImpl(f);
 
-        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar");
-        fdAddBundle(fd, "g:b2:1", "test-bundle2.jar");
+        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar", fd.getFeature().getId());
+        fdAddBundle(fd, "g:b2:1", "test-bundle2.jar", ArtifactId.fromMvnId("f:f2:1"));
 
         Map<String, String> cfgMap = new HashMap<String, String>();
-        cfgMap.put("fileStorage", resourceRoot + "/origins/testImportExportWithRegionMismatch");
         cfgMap.put("ignoreAPIRegions", "false");
 
         AnalyserTaskContext ctx = Mockito.mock(AnalyserTaskContext.class);
@@ -202,7 +202,12 @@
      * However this should still pass as the analyzer is configured to ignore regions.
      */
     public void testImportExportWithRegionMismatchIgnoreRegions() throws Exception {
-        String exJson = "[{\"name\": \"something\", \"exports\": [\"org.foo.b\"]}]";
+        String exJson =
+            "["
+                + "{\"name\": \"something\", \"exports\": [\"org.foo.b\"],\"feature-origins\":[\"f:f:1\"]},"
+                + "{\"name\": \"someotherthing\", \"exports\": [],\"feature-origins\":[\"f:f:1\"]},"
+                + "{\"name\": \"somethingelse\", \"exports\": [],\"feature-origins\":[\"f:f2:1\"]}"
+                + "]";
 
         CheckApiRegionsBundleExportsImports t = new CheckApiRegionsBundleExportsImports();
 
@@ -213,11 +218,10 @@
 
         FeatureDescriptor fd = new FeatureDescriptorImpl(f);
 
-        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar");
-        fdAddBundle(fd, "g:b2:1", "test-bundle2.jar");
+        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar", fd.getFeature().getId());
+        fdAddBundle(fd, "g:b2:1", "test-bundle2.jar", ArtifactId.fromMvnId("f:f2:1"));
 
         Map<String, String> cfgMap = new HashMap<String, String>();
-        cfgMap.put("fileStorage", resourceRoot + "/origins/testImportExportWithRegionMismatch");
         cfgMap.put("ignoreAPIRegions", "true");
 
         AnalyserTaskContext ctx = Mockito.mock(AnalyserTaskContext.class);
@@ -237,7 +241,12 @@
      * all these bundles are in the same feature they can all see each other.
      */
     public void testImportFromOtherBundleInSameFeature() throws Exception {
-        String exJson = "[{\"name\": \"blah\"}]"; // no exports
+        String exJson = "[{\"name\": \"blah\",\"feature-origins\":[\"f:f:2:1\",\"f:f3:1\"]}" +
+            ",{\"name\": \"something\",\"feature-origins\":[\"f:f:1\"]}" +
+            ",{\"name\": \"someotherthing\",\"feature-origins\":[\"f:f:1\"]}" +
+            ",{\"name\": \"abc\",\"feature-origins\":[\"f:2:1\"]}" +
+            ",{\"name\": \"xyz\",\"feature-origins\":[\"f:f2:1\"]}" +
+            "]"; // no exports
 
         CheckApiRegionsBundleExportsImports t = new CheckApiRegionsBundleExportsImports();
 
@@ -248,16 +257,13 @@
 
         FeatureDescriptor fd = new FeatureDescriptorImpl(f);
 
-        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar");
-        fdAddBundle(fd, "g:b3:1", "test-bundle3.jar");
-        fdAddBundle(fd, "g:b4:1", "test-bundle4.jar");
+        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar", ArtifactId.fromMvnId("f:f3:1"));
+        fdAddBundle(fd, "g:b3:1", "test-bundle3.jar", ArtifactId.fromMvnId("f:f3:1"));
+        fdAddBundle(fd, "g:b4:1", "test-bundle4.jar", ArtifactId.fromMvnId("f:f3:1"));
 
         AnalyserTaskContext ctx = Mockito.mock(AnalyserTaskContext.class);
         Mockito.when(ctx.getFeature()).thenReturn(f);
         Mockito.when(ctx.getFeatureDescriptor()).thenReturn(fd);
-        Mockito.when(ctx.getConfiguration()).thenReturn(
-                Collections.singletonMap("fileStorage",
-                        resourceRoot + "/origins/testImportFromOtherBundleInSameFeature"));
         t.execute(ctx);
 
         Mockito.verify(ctx, Mockito.never()).reportError(Mockito.anyString());
@@ -270,7 +276,8 @@
      * and bundle 2 imports it in the something region, so this succeeds.
      */
     public void testImportExportWithMatchingRegion() throws Exception {
-        String exJson = "[{\"name\": \"something\", \"exports\": [\"org.foo.b\"]}]";
+        String exJson = "[{\"name\": \"something\", \"exports\": [\"org.foo.b\"],\"feature-origins\":[\"f:f:1\",\"f:f2:1\"]}" +
+            ",{\"name\": \"someotherthing\", \"exports\": [\"org.foo.b\"],\"feature-origins\":[\"f:f:1\"]}]";
 
         CheckApiRegionsBundleExportsImports t = new CheckApiRegionsBundleExportsImports();
 
@@ -281,15 +288,12 @@
 
         FeatureDescriptor fd = new FeatureDescriptorImpl(f);
 
-        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar");
-        fdAddBundle(fd, "g:b2:1", "test-bundle2.jar");
+        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar", f.getId());
+        fdAddBundle(fd, "g:b2:1", "test-bundle2.jar", ArtifactId.fromMvnId("f:f2:1"));
 
         AnalyserTaskContext ctx = Mockito.mock(AnalyserTaskContext.class);
         Mockito.when(ctx.getFeature()).thenReturn(f);
         Mockito.when(ctx.getFeatureDescriptor()).thenReturn(fd);
-        Mockito.when(ctx.getConfiguration()).thenReturn(
-                Collections.singletonMap("fileStorage",
-                        resourceRoot + "/origins/testImportExportWithMatchingRegion"));
         t.execute(ctx);
 
         Mockito.verify(ctx, Mockito.never()).reportError(Mockito.anyString());
@@ -302,7 +306,11 @@
      * Bundle 2 is not explicitly part of the global region, but can still see it
      */
     public void testImportFromGlobalAlwaysSucceeds() throws Exception {
-        String exJson = "[{\"name\": \"global\", \"exports\": [\"org.foo.b\"]}]";
+        String exJson = "[{\"name\": \"global\", \"exports\": [\"org.foo.b\"],\"feature-origins\":[\"f:f:1\"]}" +
+            ",{\"name\": \"something\", \"exports\": [],\"feature-origins\":[\"f:f2:1\"]}" +
+            ",{\"name\": \"lalala\", \"exports\": [],\"feature-origins\":[\"f:f:1\"]}" +
+            ",{\"name\": \"someotherthing\", \"exports\": [],\"feature-origins\":[\"f:f:1\"]}]"
+            ;
 
         CheckApiRegionsBundleExportsImports t = new CheckApiRegionsBundleExportsImports();
 
@@ -313,8 +321,8 @@
 
         FeatureDescriptor fd = new FeatureDescriptorImpl(f);
 
-        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar");
-        fdAddBundle(fd, "g:b2:1", "test-bundle2.jar");
+        fdAddBundle(fd, "g:b1:1", "test-bundle1.jar",f.getId());
+        fdAddBundle(fd, "g:b2:1", "test-bundle2.jar",ArtifactId.fromMvnId("f:f2:1"));
 
         AnalyserTaskContext ctx = Mockito.mock(AnalyserTaskContext.class);
         Mockito.when(ctx.getFeature()).thenReturn(f);
@@ -328,9 +336,11 @@
         Mockito.verify(ctx, Mockito.never()).reportWarning(Mockito.anyString());
     }
 
-    private void fdAddBundle(FeatureDescriptor fd, String id, String file) throws IOException {
+    private void fdAddBundle(FeatureDescriptor fd, String id, String file, ArtifactId... origins) throws IOException {
+        Artifact artifact = new Artifact(ArtifactId.fromMvnId(id));
+        artifact.setFeatureOrigins(origins);
         BundleDescriptor bd1 = new BundleDescriptorImpl(
-                new Artifact(ArtifactId.fromMvnId(id)), new File(resourceRoot, file).toURI().toURL(), 0);
+                artifact, new File(resourceRoot, file).toURI().toURL(), 0);
         fd.getBundleDescriptors().add(bd1);
     }
 }
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsDependenciesTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsDependenciesTest.java
index e3cc401..bde744d 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsDependenciesTest.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsDependenciesTest.java
@@ -16,13 +16,12 @@
  */
 package org.apache.sling.feature.extension.apiregions.analyser;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 import java.util.List;
 
 import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 public class CheckApiRegionsDependenciesTest extends AbstractApiRegionsAnalyserTaskTest<CheckApiRegionsDependencies> {
 
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsDuplicatesTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsDuplicatesTest.java
index 72b5158..66cc33b 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsDuplicatesTest.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsDuplicatesTest.java
@@ -16,13 +16,12 @@
  */
 package org.apache.sling.feature.extension.apiregions.analyser;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 import java.util.List;
 
 import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 public class CheckApiRegionsDuplicatesTest extends AbstractApiRegionsAnalyserTaskTest<CheckApiRegionsDuplicates> {
 
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsTest.java
index 9d9a5d8..ba2a26a 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsTest.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsTest.java
@@ -16,12 +16,11 @@
  */
 package org.apache.sling.feature.extension.apiregions.analyser;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
 import java.util.List;
 
 import org.junit.Test;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 public class CheckApiRegionsTest extends AbstractApiRegionsAnalyserTaskTest<CheckApiRegions> {
 
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/api/TestApiRegions.java b/src/test/java/org/apache/sling/feature/extension/apiregions/api/TestApiRegions.java
index 3db71ae..ee152a2 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/api/TestApiRegions.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/api/TestApiRegions.java
@@ -16,12 +16,6 @@
  */
 package org.apache.sling.feature.extension.apiregions.api;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.Reader;
@@ -29,6 +23,11 @@
 import java.io.Writer;
 
 import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 public class TestApiRegions {
 
diff --git a/src/test/resources/origins/testImportExportWithMatchingRegion/f_f_1/bundleOrigins.properties b/src/test/resources/origins/testImportExportWithMatchingRegion/f_f_1/bundleOrigins.properties
deleted file mode 100644
index 788c4fa..0000000
--- a/src/test/resources/origins/testImportExportWithMatchingRegion/f_f_1/bundleOrigins.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-g\:b1\:1=f\:f1\:1
-g\:b2\:1=f\:f2\:1
diff --git a/src/test/resources/origins/testImportExportWithMatchingRegion/f_f_1/regionOrigins.properties b/src/test/resources/origins/testImportExportWithMatchingRegion/f_f_1/regionOrigins.properties
deleted file mode 100644
index ceb9131..0000000
--- a/src/test/resources/origins/testImportExportWithMatchingRegion/f_f_1/regionOrigins.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-f\:f1\:1=something,someotherthing
-f\:f2\:1=something
diff --git a/src/test/resources/origins/testImportExportWithRegionMismatch/f_f_1/bundleOrigins.properties b/src/test/resources/origins/testImportExportWithRegionMismatch/f_f_1/bundleOrigins.properties
deleted file mode 100644
index 788c4fa..0000000
--- a/src/test/resources/origins/testImportExportWithRegionMismatch/f_f_1/bundleOrigins.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-g\:b1\:1=f\:f1\:1
-g\:b2\:1=f\:f2\:1
diff --git a/src/test/resources/origins/testImportExportWithRegionMismatch/f_f_1/regionOrigins.properties b/src/test/resources/origins/testImportExportWithRegionMismatch/f_f_1/regionOrigins.properties
deleted file mode 100644
index 3134d99..0000000
--- a/src/test/resources/origins/testImportExportWithRegionMismatch/f_f_1/regionOrigins.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-f\:f1\:1=something,someotherthing
-f\:f2\:1=somethingelse
diff --git a/src/test/resources/origins/testImportExportWithRegionMismatchIgnoreRegions/f_f_1/bundleOrigins.properties b/src/test/resources/origins/testImportExportWithRegionMismatchIgnoreRegions/f_f_1/bundleOrigins.properties
deleted file mode 100644
index 788c4fa..0000000
--- a/src/test/resources/origins/testImportExportWithRegionMismatchIgnoreRegions/f_f_1/bundleOrigins.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-g\:b1\:1=f\:f1\:1
-g\:b2\:1=f\:f2\:1
diff --git a/src/test/resources/origins/testImportExportWithRegionMismatchIgnoreRegions/f_f_1/regionOrigins.properties b/src/test/resources/origins/testImportExportWithRegionMismatchIgnoreRegions/f_f_1/regionOrigins.properties
deleted file mode 100644
index 3134d99..0000000
--- a/src/test/resources/origins/testImportExportWithRegionMismatchIgnoreRegions/f_f_1/regionOrigins.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-f\:f1\:1=something,someotherthing
-f\:f2\:1=somethingelse
diff --git a/src/test/resources/origins/testImportExportWithRegionsMissing/f_f_1/bundleOrigins.properties b/src/test/resources/origins/testImportExportWithRegionsMissing/f_f_1/bundleOrigins.properties
deleted file mode 100644
index 788c4fa..0000000
--- a/src/test/resources/origins/testImportExportWithRegionsMissing/f_f_1/bundleOrigins.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-g\:b1\:1=f\:f1\:1
-g\:b2\:1=f\:f2\:1
diff --git a/src/test/resources/origins/testImportExportWithRegionsMissing/f_f_1/regionOrigins.properties b/src/test/resources/origins/testImportExportWithRegionsMissing/f_f_1/regionOrigins.properties
deleted file mode 100644
index 019a972..0000000
--- a/src/test/resources/origins/testImportExportWithRegionsMissing/f_f_1/regionOrigins.properties
+++ /dev/null
@@ -1 +0,0 @@
-f\:f1\:1=something
diff --git a/src/test/resources/origins/testImportFromGlobalAlwaysSucceeds/f_f_1/bundleOrigins.properties b/src/test/resources/origins/testImportFromGlobalAlwaysSucceeds/f_f_1/bundleOrigins.properties
deleted file mode 100644
index 788c4fa..0000000
--- a/src/test/resources/origins/testImportFromGlobalAlwaysSucceeds/f_f_1/bundleOrigins.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-g\:b1\:1=f\:f1\:1
-g\:b2\:1=f\:f2\:1
diff --git a/src/test/resources/origins/testImportFromGlobalAlwaysSucceeds/f_f_1/regionOrigins.properties b/src/test/resources/origins/testImportFromGlobalAlwaysSucceeds/f_f_1/regionOrigins.properties
deleted file mode 100644
index a94edd0..0000000
--- a/src/test/resources/origins/testImportFromGlobalAlwaysSucceeds/f_f_1/regionOrigins.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-f\:f1\:1=someotherthing,global,lalala
-f\:f2\:1=something
diff --git a/src/test/resources/origins/testImportFromOtherBundleInSameFeature/f_f_2/bundleOrigins.properties b/src/test/resources/origins/testImportFromOtherBundleInSameFeature/f_f_2/bundleOrigins.properties
deleted file mode 100644
index 7910020..0000000
--- a/src/test/resources/origins/testImportFromOtherBundleInSameFeature/f_f_2/bundleOrigins.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-g\:b1\:1=f\:f3\:1
-g\:b2\:1=f\:f3\:1
-g\:b3\:1=f\:f3\:1
-g\:b4\:1=f\:f3\:1
diff --git a/src/test/resources/origins/testImportFromOtherBundleInSameFeature/f_f_2/regionOrigins.properties b/src/test/resources/origins/testImportFromOtherBundleInSameFeature/f_f_2/regionOrigins.properties
deleted file mode 100644
index 3488a06..0000000
--- a/src/test/resources/origins/testImportFromOtherBundleInSameFeature/f_f_2/regionOrigins.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-f\:f1\:1=something,someotherthing
-f\:f2\:1=abc,xyz
-f\:f3\:1=blah
