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 2343c8a..17f032f 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
@@ -24,13 +24,13 @@
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
 import javax.json.Json;
 import javax.json.JsonArray;
-import javax.json.JsonArrayBuilder;
 import javax.json.JsonObject;
 import javax.json.JsonReader;
 import javax.json.JsonString;
@@ -39,9 +39,7 @@
 
 import static org.apache.sling.feature.extension.apiregions.AbstractHandler.API_REGIONS_NAME;
 import static org.apache.sling.feature.extension.apiregions.AbstractHandler.EXPORTS_KEY;
-import static org.apache.sling.feature.extension.apiregions.AbstractHandler.GLOBAL_NAME;
 import static org.apache.sling.feature.extension.apiregions.AbstractHandler.NAME_KEY;
-import static org.apache.sling.feature.extension.apiregions.AbstractHandler.ORG_FEATURE_KEY;
 
 public class APIRegionMergeHandler implements MergeHandler {
     @Override
@@ -59,6 +57,32 @@
         JsonReader srcJR = Json.createReader(new StringReader(sourceEx.getJSON()));
         JsonArray srcJA = srcJR.readArray();
 
+        Map<String, Map<String, Object>> srcRegions = new LinkedHashMap<>();
+        for (int i=0; i < srcJA.size(); i++) {
+            String regionName = null;
+            Map<String, Object> region = new LinkedHashMap<>();
+            JsonObject jo = srcJA.getJsonObject(i);
+            for (Map.Entry<String, JsonValue> entry : jo.entrySet()) {
+                Object val;
+                switch (entry.getKey()) {
+                case EXPORTS_KEY:
+                    val = readJsonArray((JsonArray) entry.getValue());
+                    break;
+                default:
+                    val = ((JsonString) entry.getValue()).getString();
+                    if (NAME_KEY.equals(entry.getKey())) {
+                        regionName = val.toString();
+                    }
+                    break;
+                }
+                region.put(entry.getKey(), val);
+            }
+            if (regionName == null) {
+                throw new IllegalStateException("No region name specified: " + sourceEx.getJSON());
+            }
+            srcRegions.put(regionName, region);
+        }
+
         JsonArray tgtJA;
         if (targetEx != null) {
             JsonReader tgtJR = Json.createReader(new StringReader(targetEx.getJSON()));
@@ -74,45 +98,51 @@
         JsonGenerator gen = Json.createGenerator(sw);
         gen.writeStartArray();
         for (JsonValue jv : tgtJA) {
-            gen.write(jv);
-        }
-
-        Map<String, List<String>> inheritedPackages = new LinkedHashMap<>(); // keep the insertion order
-        for (int i=0; i < srcJA.size(); i++) {
-            gen.writeStartObject();
-            JsonObject jo = srcJA.getJsonObject(i);
-            boolean exportsWritten = false;
-            if (!jo.containsKey(ORG_FEATURE_KEY)) {
-                gen.write(ORG_FEATURE_KEY, source.getId().toMvnId());
-
-                List<String> exports = new ArrayList<>();
-                if (jo.containsKey(EXPORTS_KEY)) {
-                    JsonArray ja = jo.getJsonArray(EXPORTS_KEY);
-                    for (JsonValue jv : ja) {
-                        if (jv instanceof JsonString) {
-                            exports.add(((JsonString) jv).getString());
+            if (jv instanceof JsonObject) {
+                JsonObject jo = (JsonObject) jv;
+                Map<String, Object> srcRegion = srcRegions.remove(jo.getString(NAME_KEY));
+                if (srcRegion != null) {
+                    gen.writeStartObject();
+                    for (Map.Entry<String, JsonValue> entry : jo.entrySet()) {
+                        Object sp = srcRegion.get(entry.getKey());
+                        if (EXPORTS_KEY.equals(entry.getKey()) && sp instanceof List) {
+                            List<String> tgtPkgs = readJsonArray((JsonArray) entry.getValue());
+                            @SuppressWarnings("unchecked")
+                            List<String> srcPkgs = (List<String>) sp;
+                            for (String srcPkg : srcPkgs) {
+                                if (!tgtPkgs.contains(srcPkg)) {
+                                    tgtPkgs.add(srcPkg);
+                                }
+                            }
+                            gen.writeStartArray(entry.getKey());
+                            for (String p : tgtPkgs) {
+                                gen.write(p);
+                            }
+                            gen.writeEnd();
+                        } else {
+                            gen.write(entry.getKey(), entry.getValue());
                         }
                     }
-                }
-
-                String name = jo.getString(NAME_KEY);
-                if (!GLOBAL_NAME.equals(name)) {
-                    ArrayList<String> localExports = new ArrayList<>(exports);
-                    for (Map.Entry<String, List<String>> entry : inheritedPackages.entrySet()) {
-                        entry.getValue().stream().filter(p -> !exports.contains(p)).forEach(exports::add);
-                    }
-                    inheritedPackages.put(name, localExports);
-
-                    JsonArrayBuilder eab = Json.createArrayBuilder();
-                    exports.stream().forEach(e -> eab.add(e));
-                    gen.write(EXPORTS_KEY, eab.build());
-                    exportsWritten = true;
+                    gen.writeEnd();
+                } else {
+                    gen.write(jv);
                 }
             }
-            for (Map.Entry<String, JsonValue> entry : jo.entrySet()) {
-                if (EXPORTS_KEY.equals(entry.getKey()) && exportsWritten)
-                    continue;
-                gen.write(entry.getKey(), entry.getValue());
+        }
+
+        // If there are any remaining regions in the src extension, process them now
+        for (Map<String, Object> region : srcRegions.values()) {
+            gen.writeStartObject();
+            for (Map.Entry<String, Object> entry : region.entrySet()) {
+                if (entry.getValue() instanceof Collection) {
+                    gen.writeStartArray(entry.getKey());
+                    for (Object o : (Collection<?>) entry.getValue()) {
+                        gen.write(o.toString());
+                    }
+                    gen.writeEnd();
+                } else {
+                    gen.write(entry.getKey(), entry.getValue().toString());
+                }
             }
             gen.writeEnd();
         }
@@ -122,4 +152,17 @@
 
         targetEx.setJSON(sw.toString());
     }
+
+    private static List<String> readJsonArray(JsonArray jsonArray) {
+        List<String> l = new ArrayList<>();
+        for (JsonValue jv : jsonArray) {
+            if (jv instanceof JsonString) {
+                String pkg = ((JsonString) jv).getString();
+                if (!pkg.startsWith("#")) { // ignore comment lines
+                    l.add(pkg);
+                }
+            }
+        }
+        return l;
+    }
 }
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
index 0589a67..a67ceb6 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/AbstractHandler.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/AbstractHandler.java
@@ -36,7 +36,6 @@
 
     static final String NAME_KEY = "name";
     static final String EXPORTS_KEY = "exports";
-    static final String ORG_FEATURE_KEY = "org-feature";
 
     private static final String FILE_PREFIX = "apiregions.";
     private static final String FILE_STORAGE_DIR_KEY = "fileStorage";
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
index b963d9f..a8b9052 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/BundleArtifactFeatureHandler.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/BundleArtifactFeatureHandler.java
@@ -58,10 +58,7 @@
 
         for (Artifact b : feature.getBundles()) {
             String id = b.getId().toMvnId().trim();
-
-            String fid = b.getMetadata().get(ORG_FEATURE_KEY);
-            if (fid == null)
-                fid = feature.getId().toMvnId().trim();
+            String fid = feature.getId().toMvnId().trim();
 
             String m = map.getProperty(id);
             if (m != null) {
@@ -89,11 +86,7 @@
         for (JsonValue jv : ja) {
             if (jv instanceof JsonObject) {
                 JsonObject jo = (JsonObject) jv;
-                String fid = null;
-                if (jo.containsKey(ORG_FEATURE_KEY))
-                    fid = jo.getString(ORG_FEATURE_KEY);
-                if (fid == null)
-                    fid = feature.getId().toMvnId();
+                String fid = feature.getId().toMvnId();
 
                 Set<String> regionSet = new HashSet<>();
                 String regions = frMap.getProperty(fid);
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 9fd6860..488df88 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
@@ -54,28 +54,25 @@
                 + "\"exports\": [\"a.b.c\",\"d.e.f\"]},"
                 + "{\"name\":\"internal\","
                 + "\"exports\":[\"xyz\"],"
-                + "\"org-feature\":\"some:feature:1\"}]");
+                + "\"some-key\":\"some-val\"}]");
 
         Extension srEx = new Extension(ExtensionType.JSON, "api-regions", false);
         srEx.setJSON("[{\"name\":\"global\","
                 + "\"exports\": [\"test\"]},"
                 + "{\"name\":\"something\","
                 + "\"exports\": [\"a.ha\"],"
-                + "\"org-feature\": \"different:feature:1\"}]");
+                + "\"my-key\": \"my-val\"}]");
 
         armh.merge(null, tf, sf, tgEx, srEx);
 
         String expectedJSON = "[{\"name\":\"global\","
-                + "\"exports\": [\"a.b.c\",\"d.e.f\"]},"
+                + "\"exports\": [\"a.b.c\",\"d.e.f\", \"test\"]},"
                 + "{\"name\":\"internal\","
                 + "\"exports\":[\"xyz\"],"
-                + "\"org-feature\":\"some:feature:1\"},"
-                + "{\"name\":\"global\","
-                + "\"org-feature\":\"y:s:2\","
-                + "\"exports\": [\"test\"]},"
+                + "\"some-key\":\"some-val\"},"
                 + "{\"name\":\"something\","
                 + "\"exports\": [\"a.ha\"],"
-                + "\"org-feature\": \"different:feature:1\"}]";
+                + "\"my-key\": \"my-val\"}]";
         JsonReader er = Json.createReader(new StringReader(expectedJSON));
         JsonReader ar = Json.createReader(new StringReader(tgEx.getJSON()));
         JsonArray ea = er.readArray();
@@ -84,6 +81,7 @@
         assertEquals(ea, aa);
     }
 
+
     @Test
     public void testRegionExportsInheritance() throws Exception {
         APIRegionMergeHandler armh = new APIRegionMergeHandler();
@@ -95,24 +93,20 @@
         srEx.setJSON("[{\"name\":\"global\","
                 + "\"exports\": [\"a.b.c\",\"d.e.f\"]},"
                 + "{\"name\":\"deprecated\","
-                + "\"exports\":[\"klm\",\"qrs\"]},"
+                + "\"exports\":[\"klm\",\"#ignored\",\"qrs\"]},"
                 + "{\"name\":\"internal\","
                 + "\"exports\":[\"xyz\"]},"
                 + "{\"name\":\"forbidden\","
-                + "\"exports\":[\"abc\",\"klm\"]},"
-                + "{\"name\":\"internal\","
-                + "\"exports\":[\"test\"],"
-                + "\"org-feature\":\"an.other:feature:123\"}]");
+                + "\"exports\":[\"abc\",\"klm\"]}]");
 
         armh.merge(null, tf, sf, null, srEx);
 
         Extension tgEx = tf.getExtensions().iterator().next();
 
-        String expectedJSON = "[{\"name\":\"global\",\"org-feature\":\"y:s:2\",\"exports\":[\"a.b.c\",\"d.e.f\"]},"
-                + "{\"name\":\"deprecated\",\"org-feature\":\"y:s:2\",\"exports\":[\"klm\",\"qrs\"]},"
-                + "{\"name\":\"internal\",\"org-feature\":\"y:s:2\",\"exports\":[\"xyz\",\"klm\",\"qrs\"]},"
-                + "{\"name\":\"forbidden\",\"org-feature\":\"y:s:2\",\"exports\":[\"abc\",\"klm\",\"qrs\",\"xyz\"]},"
-                + "{\"name\":\"internal\",\"org-feature\":\"an.other:feature:123\",\"exports\":[\"test\"]}]";
+        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\"]}]";
         JsonReader er = Json.createReader(new StringReader(expectedJSON));
         JsonReader ar = Json.createReader(new StringReader(tgEx.getJSON()));
         JsonArray ea = er.readArray();
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
index f000a4c..9ff48de 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/BundleArtifactFeatureHandlerTest.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/BundleArtifactFeatureHandlerTest.java
@@ -16,15 +16,6 @@
  */
 package org.apache.sling.feature.extension.apiregions;
 
-import static org.junit.Assert.assertEquals;
-
-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 org.apache.sling.feature.Artifact;
 import org.apache.sling.feature.ArtifactId;
 import org.apache.sling.feature.Extension;
@@ -34,6 +25,15 @@
 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 {
@@ -43,7 +43,6 @@
         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"));
-        b3a.getMetadata().put("org-feature", "some.other:feature:123");
         Artifact b3b = new Artifact(ArtifactId.fromMvnId("org.sling:b3:1"));
         f.getBundles().addAll(Arrays.asList(b1, b2, b3a, b3b));
 
@@ -58,7 +57,7 @@
         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", "some.other:feature:123,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);
     }
 
@@ -73,8 +72,7 @@
                 + "{\"name\":\"internal\","
                 + "\"exports\":[\"xyz\"]},"
                 + "{\"name\":\"global\","
-                + "\"exports\":[\"test\"],"
-                + "\"org-feature\":\"an.other:feature:123\"}]");
+                + "\"exports\":[\"test\"]}]");
 
         bafh.postProcess(new TestHandlerContextImpl(), f, ex);
 
@@ -83,7 +81,6 @@
         actual.load(new FileReader(p));
 
         Properties expected = new Properties();
-        expected.put("an.other:feature:123", "global");
         expected.put("org.sling:something:1.2.3", "internal,global");
 
         String[] al = ((String) actual.remove("org.sling:something:1.2.3")).split(",");
