diff --git a/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java b/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
index 3b9279c..2164a86 100644
--- a/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
+++ b/src/main/java/org/apache/sling/feature/apiregions/impl/ResolverHookImpl.java
@@ -283,19 +283,13 @@
             return Collections.emptyList();
 
         List<String> res = new ArrayList<>();
-        boolean found = false;
         for (String region : regions) {
             Set<String> packages = regionPackageMap.get(region);
             if (packages == null)
                 continue;
 
-            if (found) {
-                // Since later regions inherit from earlier ones, if the package has been found before
-                // it also applies to this region.
+            if (packages.contains(packageName)) {
                 res.add(region);
-            } else if (packages.contains(packageName)) {
-                res.add(region);
-                found = true;
             }
         }
         return res;
diff --git a/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java b/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
index fcc86e8..9768cdf 100644
--- a/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
+++ b/src/test/java/org/apache/sling/feature/apiregions/impl/ResolverHookImplTest.java
@@ -472,6 +472,38 @@
     }
 
     @Test
+    public void testMultipleRegionsNoneMatching() {
+        Map<Entry<String, Version>, List<String>> bsnvermap = new HashMap<>();
+        bsnvermap.put(new AbstractMap.SimpleEntry<String,Version>("bundle.1", new Version(1,0,0)),
+                Collections.singletonList("b1"));
+        bsnvermap.put(new AbstractMap.SimpleEntry<String,Version>("bundle.2", new Version(1,0,0)),
+                Collections.singletonList("b2"));
+
+        Map<String, Set<String>> bfmap = new HashMap<>();
+        bfmap.put("b1", Collections.singleton("f1"));
+        bfmap.put("b2", Collections.singleton("f2"));
+
+        Map<String, Set<String>> frmap = new HashMap<>();
+        frmap.put("f1", new HashSet<>(Arrays.asList(
+                RegionEnforcer.GLOBAL_REGION, "org.foo.blah")));
+        frmap.put("f2", new HashSet<>(Arrays.asList("org.foo.bar",
+                RegionEnforcer.GLOBAL_REGION, "org.foo.blah")));
+
+        Map<String, Set<String>> rpmap = new HashMap<>();
+        rpmap.put("org.foo.bar", Collections.singleton("org.test"));
+        rpmap.put(RegionEnforcer.GLOBAL_REGION, Collections.singleton("org.something"));
+        rpmap.put("org.foo.blah", Collections.singleton("org.something"));
+
+        ResolverHookImpl rh = new ResolverHookImpl(bsnvermap, bfmap, frmap, rpmap, Collections.emptySet());
+
+        BundleRequirement req0 = mockRequirement("b1", bsnvermap);
+        BundleCapability cap0 = mockCapability("org.test", "b2", bsnvermap);
+        List<BundleCapability> candidates0 = new ArrayList<>(Arrays.asList(cap0));
+        rh.filterMatches(req0, candidates0);
+        assertEquals(Collections.emptyList(), candidates0);
+    }
+
+    @Test
     public void testGetRegionsForPackage() {
         Set<String> regions = new HashSet<>(Arrays.asList("r1", "r2", "r3"));
         Map<String, Set<String>> featureRegionMap = Collections.singletonMap("f2", regions);
@@ -492,10 +524,8 @@
         assertEquals(Collections.emptyList(), rh.getRegionsForPackage(null, "f2"));
         assertEquals(Collections.emptyList(), rh.getRegionsForPackage("org.foo", "f2"));
 
-        assertEquals(Collections.singletonList("r3"),
-            rh.getRegionsForPackage("org.foo.bar", "f2"));
-        assertEquals(Arrays.asList("r2", "r3"),
-            rh.getRegionsForPackage("a.b.c", "f2"));
+        assertEquals(Collections.singletonList("r3"), rh.getRegionsForPackage("org.foo.bar", "f2"));
+        assertEquals(Collections.singletonList("r2"), rh.getRegionsForPackage("a.b.c", "f2"));
     }
 
     @Test
