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 adb244f..1b5ebce 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
@@ -16,12 +16,6 @@
  */
 package org.apache.sling.feature.extension.apiregions.analyser;
 
-import java.io.IOException;
-import javax.json.JsonArray;
-
-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.ApiRegions;
@@ -30,41 +24,19 @@
 
     @Override
     public final void execute(AnalyserTaskContext ctx) throws Exception {
-        Feature feature = ctx.getFeature();
-
-        // extract and check the api-regions
-
-        Extensions extensions = feature.getExtensions();
-        Extension apiRegionsExtension = extensions.getByName(ApiRegions.EXTENSION_NAME);
-        if (apiRegionsExtension == null) {
-            // no need to be analyzed
-            return;
-        }
-
-        if (apiRegionsExtension.getJSON() == null || apiRegionsExtension.getJSON().isEmpty()) {
-            // no need to be analyzed
-            return;
-        }
-
-        if (apiRegionsExtension.getJSONStructure() == null) {
-            ctx.reportError("API Regions '" + apiRegionsExtension.getJSON()
-                    + "' does not represent a valid JSON 'api-regions'");
-            return;
-        }
-
-        // read the api-regions and create a Sieve data structure for checks
-
+        // read the api-regions
         ApiRegions apiRegions;
         try {
-            apiRegions = ApiRegions.parse((JsonArray) apiRegionsExtension.getJSONStructure());
-        } catch (IOException e) {
-            ctx.reportError("API Regions '"
-                    + apiRegionsExtension.getJSON()
-                    + "' does not represent a valid JSON 'api-regions': "
+            apiRegions = ApiRegions.getApiRegions(ctx.getFeature());
+        } catch (final IllegalArgumentException e) {
+            ctx.reportError("API Regions does not represent a valid JSON 'api-regions': "
                     + e.getMessage());
             return;
         }
-
+        if ( apiRegions == null ) {
+            // no need to be analysed
+            return;
+        }
         execute(apiRegions, ctx);
     }
 
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackages.java b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackages.java
deleted file mode 100644
index cda708d..0000000
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackages.java
+++ /dev/null
@@ -1,107 +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.analyser;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.sling.feature.analyser.task.AnalyserTask;
-import org.apache.sling.feature.analyser.task.AnalyserTaskContext;
-import org.apache.sling.feature.extension.apiregions.api.ApiRegions;
-import org.apache.sling.feature.scanner.BundleDescriptor;
-import org.apache.sling.feature.scanner.PackageInfo;
-import org.osgi.framework.Version;
-
-
-public class CheckApiRegionsBundleUnversionedPackages implements AnalyserTask {
-
-    /** Ignore JDK packages */
-    private static final List<String> IGNORED_IMPORT_PREFIXES = Arrays.asList("java.", "javax.", "org.w3c.", "org.xml.");
-
-    @Override
-    public String getName() {
-        return "Bundle Unversioned Packages Check";
-    }
-
-    @Override
-    public String getId() {
-        return ApiRegions.EXTENSION_NAME + "-unversioned-packages";
-    }
-
-    private boolean ignoreImportPackage(final String name) {
-        for(final String prefix : IGNORED_IMPORT_PREFIXES) {
-            if ( name.startsWith(prefix) ) {
-                return true;
-            }
-        }
-        return false;
-    }
-    
-    @Override
-    public void execute(final AnalyserTaskContext ctx) throws Exception {
-        for(final BundleDescriptor info : ctx.getFeatureDescriptor().getBundleDescriptors()) {
-
-                
-            final List<PackageInfo> exportWithoutVersion = new ArrayList<>();
-            for(final PackageInfo i : info.getExportedPackages()) {
-                if ( i.getPackageVersion().compareTo(Version.emptyVersion) == 0 ) {
-                    exportWithoutVersion.add(i);
-                }
-            }
-            final List<PackageInfo> importWithoutVersion = new ArrayList<>();
-            for(final PackageInfo i : info.getImportedPackages()) {
-                if ( i.getVersion() == null && !ignoreImportPackage(i.getName()) ) {
-                    importWithoutVersion.add(i);
-                }
-            }
-
-            final String key = "Bundle ".concat(info.getArtifact().getId().getArtifactId())
-                .concat(":").concat(info.getArtifact().getId().getVersion());
-
-            if ( !importWithoutVersion.isEmpty() ) {
-                ctx.reportArtifactWarning(info.getArtifact().getId(),
-                        key.concat(" is importing ").concat(getPackageInfo(importWithoutVersion)).concat(" without specifying a version range."));
-            }
-            if ( !exportWithoutVersion.isEmpty() ) {
-                ctx.reportArtifactWarning(info.getArtifact().getId(),
-                        key.concat(" is exporting ").concat(getPackageInfo(exportWithoutVersion)).concat(" without a version."));
-            }
-        }
-    }
-
-    private String getPackageInfo(final List<PackageInfo> pcks) {
-        if ( pcks.size() == 1 ) {
-            return "package ".concat(pcks.get(0).getName());
-        }
-        final StringBuilder sb = new StringBuilder("packages ");
-        boolean first = true;
-        sb.append('[');
-        for(final PackageInfo info : pcks) {
-            if ( first ) {
-                first = false;
-            } else {
-                sb.append(", ");
-            }
-            sb.append(info.getName());
-        }
-        sb.append(']');
-        return sb.toString();
-    }
-}
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 bbfff43..feb89bf 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
@@ -16,20 +16,14 @@
  */
 package org.apache.sling.feature.extension.apiregions.analyser;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-import javax.json.JsonArray;
 
-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;
 
-public class CheckApiRegionsOrder implements AnalyserTask {
+public class CheckApiRegionsOrder extends AbstractApiRegionsAnalyserTask {
 
     @Override
     public String getId() {
@@ -42,21 +36,15 @@
     }
 
     @Override
-    public final void execute(AnalyserTaskContext ctx) throws Exception {
-        String order = ctx.getConfiguration().get("order");
-        Feature feature = ctx.getFeature();
-        if (feature == null) {
-            reportError(ctx, "No feature found. Illegal Analyser State.");
-            return;
-        }
-
+    public final void execute(final ApiRegions apiRegions, final AnalyserTaskContext ctx) throws Exception {
+        final String order = ctx.getConfiguration().get("order");
         if (order == null) {
-            reportError(ctx, "This analyser task must be configured: " + getId() + " for feature " + feature.getId());
+            reportError(ctx, "This analyser task must be configured: " + getId() + " for feature " + ctx.getFeature().getId());
             reportError(ctx, "Must specify configuration key 'order'.");
             return;
         }
 
-        String[] sl = order.split("[,]");
+        final String[] sl = order.split("[,]");
         List<String> prescribedOrder = new ArrayList<>();
         for (String s : sl) {
             s = s.trim();
@@ -68,39 +56,20 @@
             return;
         }
 
-        // extract and check the api-regions
-        Extensions extensions = feature.getExtensions();
-        Extension apiRegionsExtension = extensions.getByName(ApiRegions.EXTENSION_NAME);
-        if (apiRegionsExtension == null) {
-            // no need to be analyzed
-            return;
-        }
-
-        String jsonRepresentation = apiRegionsExtension.getJSON();
-        if (jsonRepresentation == null || jsonRepresentation.isEmpty()) {
-            // no need to be analyzed
-            return;
-        }
-
-        try {
-            int regionIdx = 0;
-            ApiRegions apiRegions = ApiRegions.parse((JsonArray) apiRegionsExtension.getJSONStructure());
-            for (final ApiRegion region : apiRegions.listRegions()) {
-                String name = region.getName();
-                if (!prescribedOrder.contains(name)) {
-                    reportError(ctx, "Region found with undeclared name: " + name);
-                    return;
-                }
-                int prevIdx = regionIdx;
-                regionIdx = validateRegion(regionIdx, prescribedOrder, name);
-                if (regionIdx < 0) {
-                    reportError(ctx, "Region '" + name + "' appears in the wrong order. It appears after '"
-                            + prescribedOrder.get(prevIdx) + "'. Order of regions should be " + prescribedOrder);
-                    return;
-                }
+        int regionIdx = 0;
+        for (final ApiRegion region : apiRegions.listRegions()) {
+            String name = region.getName();
+            if (!prescribedOrder.contains(name)) {
+                reportError(ctx, "Region found with undeclared name: " + name);
+                return;
             }
-        } catch (final IOException e) {
-            ctx.reportError("Invalid api regions");
+            int prevIdx = regionIdx;
+            regionIdx = validateRegion(regionIdx, prescribedOrder, name);
+            if (regionIdx < 0) {
+                reportError(ctx, "Region '" + name + "' appears in the wrong order. It appears after '"
+                        + prescribedOrder.get(prevIdx) + "'. Order of regions should be " + prescribedOrder);
+                return;
+            }
         }
     }
 
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 c40b98c..618a4bb 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
@@ -314,6 +314,9 @@
         if ( ext.getType() != ExtensionType.JSON ) {
             throw new IllegalArgumentException("Extension " + ext.getName() + " must have JSON type");
         }
+        if ( ext.getJSONStructure() == null ) {
+            return new ApiRegions();
+        }
         try {
             return parse(ext.getJSONStructure().asJsonArray());
         } catch ( final IOException ioe) {
diff --git a/src/main/resources/META-INF/services/org.apache.sling.feature.analyser.task.AnalyserTask b/src/main/resources/META-INF/services/org.apache.sling.feature.analyser.task.AnalyserTask
index 4f80111..1ed0442 100644
--- a/src/main/resources/META-INF/services/org.apache.sling.feature.analyser.task.AnalyserTask
+++ b/src/main/resources/META-INF/services/org.apache.sling.feature.analyser.task.AnalyserTask
@@ -3,7 +3,6 @@
 org.apache.sling.feature.extension.apiregions.analyser.CheckApiRegionsDuplicates
 org.apache.sling.feature.extension.apiregions.analyser.CheckApiRegionsOrder
 org.apache.sling.feature.extension.apiregions.analyser.CheckApiRegionsBundleExportsImports
-org.apache.sling.feature.extension.apiregions.analyser.CheckApiRegionsBundleUnversionedPackages
 org.apache.sling.feature.extension.apiregions.analyser.CheckApiRegionsCrossFeatureDups
 org.apache.sling.feature.extension.apiregions.analyser.CheckArtifactRules
 org.apache.sling.feature.extension.apiregions.analyser.CheckConfigurationApi
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 ba362d0..c6c1484 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
@@ -32,10 +32,12 @@
 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.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.ApiRegions;
 import org.apache.sling.feature.scanner.BundleDescriptor;
 import org.apache.sling.feature.scanner.FeatureDescriptor;
 import org.apache.sling.feature.scanner.PackageInfo;
@@ -89,22 +91,17 @@
         assertTrue(errors.isEmpty());
     }
 
-    @Test
-    public void testApiRegionsIsNotJSON() throws Exception {
-        List<String> errors = execute("this is not a JSON string");
-
-        assertFalse(errors.isEmpty());
-        assertTrue(errors.iterator().next().contains("does not represent a valid JSON 'api-regions'"));
-    }
-
     protected final List<String> execute(String apiRegionJSON) throws Exception {
         Extension extension = mock(Extension.class);
+        when(extension.getName()).thenReturn(ApiRegions.EXTENSION_NAME);
         when(extension.getJSON()).thenReturn(apiRegionJSON);
+        when(extension.getType()).thenReturn(ExtensionType.JSON);
         if (apiRegionJSON != null) {
             JsonReader reader = Json.createReader(new StringReader(apiRegionJSON));
             JsonArray array = null;
             try {
                 array = reader.readArray();
+                when(extension.getType()).thenReturn(ExtensionType.JSON);
             } catch (final JsonParsingException | NothingToRead ignore) {
                 // ignored
             }
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackagesTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackagesTest.java
deleted file mode 100644
index ff4695c..0000000
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackagesTest.java
+++ /dev/null
@@ -1,84 +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.analyser;
-
-import org.apache.sling.feature.*;
-import org.apache.sling.feature.analyser.task.AnalyserTaskContext;
-import org.apache.sling.feature.extension.apiregions.api.ApiRegions;
-import org.apache.sling.feature.scanner.BundleDescriptor;
-import org.apache.sling.feature.scanner.FeatureDescriptor;
-import org.apache.sling.feature.scanner.impl.BundleDescriptorImpl;
-import org.apache.sling.feature.scanner.impl.FeatureDescriptorImpl;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.mockito.Mockito;
-
-import java.io.File;
-import java.io.IOException;
-import static org.junit.Assert.assertEquals;
-
-public class CheckApiRegionsBundleUnversionedPackagesTest {
-    private static File resourceRoot;
-
-    @BeforeClass
-    public static void setupClass() {
-        resourceRoot =
-                new File(CheckApiRegionsBundleUnversionedPackagesTest.class.
-                        getResource("/test-framework.jar").getFile()).getParentFile();
-    }
-
-    @Test
-    public void testId() {
-        assertEquals(ApiRegions.EXTENSION_NAME + "-unversioned-packages", new CheckApiRegionsBundleUnversionedPackages().getId());
-    }
-
-    @Test
-    public void testBundleUnversionedPackage() throws Exception {
-        CheckApiRegionsBundleUnversionedPackages t = new CheckApiRegionsBundleUnversionedPackages();
-
-        Feature f = new Feature(ArtifactId.fromMvnId("f:f:1"));
-        f.setComplete(true);
-        FeatureDescriptor fd = new FeatureDescriptorImpl(f);
-
-        fdAddBundle(fd, "g:b1:1", "test-bundle5.jar");
-
-        AnalyserTaskContext ctx = Mockito.mock(AnalyserTaskContext.class);
-        Mockito.when(ctx.getFeature()).thenReturn(f);
-        Mockito.when(ctx.getFeatureDescriptor()).thenReturn(fd);
-        t.execute(ctx);
-
-        Mockito.verify(ctx, Mockito.times(2)).reportArtifactWarning(Mockito.any(), Mockito.anyString());
-
-        Mockito.verify(ctx).reportArtifactWarning(
-                Mockito.eq(ArtifactId.fromMvnId("g:b1:1")),
-                Mockito.contains("org.foo.i"));
-        Mockito.verify(ctx).reportArtifactWarning(
-                Mockito.eq(ArtifactId.fromMvnId("g:b1:1")),
-                Mockito.contains("org.foo.e"));
-    }
-
-
-    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(
-                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/CheckApiRegionsOrderTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsOrderTest.java
index 3948129..ca59764 100644
--- a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsOrderTest.java
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsOrderTest.java
@@ -77,7 +77,7 @@
         Mockito.when(ctx.getFeature()).thenReturn(f);
 
         caro.execute(ctx);
-        Mockito.verify(ctx).reportError(Mockito.contains("Invalid api regions"));
+        Mockito.verify(ctx).reportError(Mockito.contains("API Regions does not represent a valid JSON"));
     }
 
     @Test
@@ -118,6 +118,12 @@
 
     @Test
     public void testEmptyOrder() throws Exception {
+        Extension e = new Extension(ExtensionType.JSON, "api-regions", ExtensionState.OPTIONAL);
+        e.setJSON("[{\"name\":\"foo\"}]");
+
+        Feature f = new Feature(ArtifactId.fromMvnId("a:b:1"));
+        f.getExtensions().add(e);
+
         CheckApiRegionsOrder caro = new CheckApiRegionsOrder();
 
         Map<String, String> cfgMap = new HashMap<>();
@@ -125,30 +131,25 @@
 
         AnalyserTaskContext ctx = Mockito.mock(AnalyserTaskContext.class);
         Mockito.when(ctx.getConfiguration()).thenReturn(cfgMap);
-        Mockito.when(ctx.getFeature()).thenReturn(new Feature(ArtifactId.fromMvnId("a:b:1")));
+        Mockito.when(ctx.getFeature()).thenReturn(f);
 
         caro.execute(ctx);
         Mockito.verify(ctx).reportError(Mockito.contains("No regions"));
     }
 
     @Test
-    public void testNoFeature() throws Exception {
-        CheckApiRegionsOrder caro = new CheckApiRegionsOrder();
-
-        AnalyserTaskContext ctx = Mockito.mock(AnalyserTaskContext.class);
-        Mockito.when(ctx.getConfiguration()).thenReturn(new HashMap<>());
-
-        caro.execute(ctx);
-        Mockito.verify(ctx).reportError(Mockito.contains("No feature"));
-    }
-
-    @Test
     public void testNoOrderConfig() throws Exception {
+        Extension e = new Extension(ExtensionType.JSON, "api-regions", ExtensionState.OPTIONAL);
+        e.setJSON("[{\"name\":\"foo\"}]");
+
+        Feature f = new Feature(ArtifactId.fromMvnId("a:b:1"));
+        f.getExtensions().add(e);
+
         CheckApiRegionsOrder caro = new CheckApiRegionsOrder();
 
         AnalyserTaskContext ctx = Mockito.mock(AnalyserTaskContext.class);
         Mockito.when(ctx.getConfiguration()).thenReturn(new HashMap<>());
-        Mockito.when(ctx.getFeature()).thenReturn(new Feature(ArtifactId.fromMvnId("a:b:1")));
+        Mockito.when(ctx.getFeature()).thenReturn(f);
 
         caro.execute(ctx);
         Mockito.verify(ctx).reportError(Mockito.contains("'order'"));
